Java 如何在WEB应用程序中使用无登录页面的Shiro

Java 如何在WEB应用程序中使用无登录页面的Shiro,java,struts2,shiro,Java,Struts2,Shiro,我有一个用Struts2编写的WEB应用程序。而且它没有登录页面。登录页面是主页的一个div。 我想使用Shiro来保护我的应用程序 没有登录页面,我不知道如何使用Shiro。 我不明白如何从Struts Action向Shiro传递用户名 请帮帮我。 多谢各位 我的行动: public class InternalLoginAction extends ActionSupport { private String remoteUser; public String execute() th

我有一个用Struts2编写的WEB应用程序。而且它没有登录页面。登录页面是主页的一个div。 我想使用Shiro来保护我的应用程序

没有登录页面,我不知道如何使用Shiro。 我不明白如何从Struts Action向Shiro传递用户名

请帮帮我。 多谢各位

我的行动:

public class InternalLoginAction extends ActionSupport {

private String remoteUser;

public String execute() throws NamingException, SQLException {
    HttpServletRequest request = ServletActionContext.getRequest();
    remoteUser = request.getRemoteUser();
    if (remoteUser != null) {
        User user = new User();
        user.setId(user.calcIdTemp(remoteUser));
        user.setName(remoteUser);
        user.setCompanyId(LoginDao.getUserCompanyId(remoteUser.toUpperCase()));
        user.setExternal(false);
        user.saveSession();

        //I want to pass username to Shiro here.

    }
    return SUCCESS;
}

public String getRemoteUser() {
    return remoteUser;
}

public void setRemoteUser(String remoteUser) {
    this.remoteUser = remoteUser;
}
}

很抱歉,我无法显示所有页面。只有这一点:

<div id="login-dialog" title="Authorization" class="hide">
  <form id="login-dialog-form" >
  <table>
    <tr>
      <td>Login:</td>
      <td>
        <input id="login-dialog-login" name="form.login" size="22" maxlength="22" class="text ui-widget-content ui-corner-all" data-parsley-required="true" autofocus>
      </td>
    </tr>
    <tr>
      <td>Password:</td>
      <td>
       <input id="login-dialog-pass" name="form.pw" type="password" size="22" maxlength="22" class="text ui-widget-content ui-corner-all" data-parsley-required="true" data-parsley-minlength="6" data-parsley-maxlength="20">
      </td>
    </tr>
  </table>
  <br><a href="#" onclick="wsp.internalLogin()">I am employee of XXX</a>          
  </form>
</div>  

您可能希望在开始操作之前处理所有登录逻辑

Shiro使用Servlet过滤器进行开箱即用。例如,这个示例(只是一对JSP)实际上并不处理任何登录逻辑:


而不是呈现登录表单。Shiro Servlet过滤器截取登录页面的帖子(在本例中为
/login.jsp
),并自动处理所有其他内容。

您的登录表单/操作是什么样子?@Brian Demers补充道,谢谢您的回答。当我只有div而没有页面时,我真的不明白如何使用shiro.loginUrl=/login.jsp。我想按原样使用Shiro,但我想将用户名传递给Shiro,因为我不想修改我的应用程序。呈现登录div的页面URL是什么?我有全部功能。请看我的第一条信息。若我只使用链接,应用程序将无法运行。我真的不想为Shiro更改我的应用程序。我不想变得过于密集,但你应该能够使用
/xxx/public/internalLogin.do
作为你的登录页面。您的操作可能只是
返回SUCCESS
,(并为远程用户返回
SecurityUtils.getSubject()
)。或者,您可以基于该主题构建自己的bean。如果您想自己调用实际的
.login()
,请查看:
 internalLogin: function() {
$.ajax({
  url: '/xxx/public/internalLogin.do',
  type: 'POST',
  success: function(data) {
    location.reload(true);
  },
  error: function(request, textStatus, errorThrown) {
    wsp.alertMessage(request.responseText);
  }
});