UserLogin作为控制登录的Action,校验密码成功后记录session,可以选择记住登陆状态,登陆成功后自动跳转到登陆前的URL;

功能:

·UserLogin作为控制登录的Action,校验密码成功后记录session,可以选择记住登陆状态,登陆成功后自动跳转到登陆前的URL;

·UserLogout作为控制登录推出的Action,移除session,删除cookie;

·MainInfo和HeadInfo模拟了两个相对独立的Action用于展示页面内容;

·LoginInterceptor作为检查登录状态的拦截器,先检查session,后检查本地cookie;

·mainInfo.action和headInfo.action被配置通过LoginInterceptor拦截器检查。

 

 

struts.xml配置文件

[xhtml]  view plain copy
  1. <struts>  
  2.     <package name="common-web" extends="struts-default">  
  3.         <interceptors>  
  4.             <interceptor name="loginInterceptor" class="loginInterceptor" />  
  5.   
  6.             <interceptor-stack name="loginDefaultStack">  
  7.                 <interceptor-ref name="loginInterceptor" />  
  8.                 <interceptor-ref name="defaultStack" />  
  9.             </interceptor-stack>  
  10.         </interceptors>  
  11.   
  12.         <default-interceptor-ref name="loginDefaultStack" />  
  13.   
  14.         <global-results>  
  15.             <result name="login" type="redirect">userLogin.action</result>  
  16.         </global-results>  
  17.   
  18.         <action name="userLogin" class="userLoginAction">  
  19.             <result type="redirect">${goingToURL}</result>   
  20.             <result name="input">/page/user_login.jsp</result>  
  21.             <interceptor-ref name="defaultStack" />  
  22.         </action>  
  23.           
  24.         <action name="userLogout" class="userLogoutAction"></action>  
  25.   
  26.         <action name="mainInfo" class="mainInfoAction">  
  27.             <result name="success">/page/main.jsp</result>  
  28.         </action>  
  29.   
  30.         <action name="headInfo" class="headInfoAction">  
  31.             <result name="success">/page/head.jsp</result>  
  32.         </action>  
  33.     </package>  
  34. </struts>  

struts.xml遇到的问题:

1、拦截器与Action必须配置在一个package下,否则拦截器不会对其他package下的Action生效。

2、暂无。

 

 

 

UserLogin.java主要源码

[java]  view plain copy
  1. public class UserLogin extends ActionSupport implements ServletResponseAware, SessionAware {  
  2.   
  3.     private String              name;  
  4.     private String              password;  
  5.     private boolean             rememberMe;  
  6.   
  7.     private HttpServletResponse response;  
  8.     private Map<String, Object> session;  
  9.   
  10.     private String              goingToURL;//登录前的URL  
  11.   
  12.     public String execute() throws Exception {  
  13.   
  14.         //...  
  15.   
  16.         if (isLoginSucc) {  
  17.   
  18.             //成功登录后记录session和cookie  
  19.             if (rememberMe) {  
  20.                 String t = name + "," + password;  
  21.   
  22.                 Cookie cookie = new Cookie(CommonConstants.COOKIE_KEY_REMEMBER_LOGIN, t);  
  23.   
  24.                 cookie.setMaxAge(CommonConstants.COOKIE_AGE);//设置cookie存活时间  
  25.                 response.addCookie(cookie);  
  26.   
  27.             }  
  28.   
  29.             //设置session中的登录用户信息                   
  30.             session.put(CommonConstants.SESSION_KEY_USER_NAME, name);  
  31.   
  32.             //从session中获取登陆前URL,获取后移除session中的这个值  
  33.             String goingToURL = (String) session.get(CommonConstants.SESSION_KEY_URL_BEFORE_LOGIN);  
  34.             setGoingToURL(goingToURL);  
  35.             session.remove(CommonConstants.SESSION_KEY_URL_BEFORE_LOGIN);  
  36.   
  37.             logger.info("登录成功[" + name + "]");  
  38.             return SUCCESS;  
  39.         } else {  
  40.             logger.error("登录失败[" + name + "][" + password + "]");  
  41.             return INPUT;  
  42.         }  
  43.     }  
  44.       
  45.     //... getter & setter methods  
  46. }  

UserLogin.java遇到的问题:

1、cookie.setDomain(),cookie.setPath()设置错误会导致cookie写入失败;

2、cookie.Value中有分号“;”时,会导致cookie写入失败,改为逗号解决;

 

 

 

LoginInterceptor.java主要源码

[java]  view plain copy
  1. public class LoginInterceptor extends AbstractInterceptor {  
  2.   
  3.     /* (non-Javadoc) 
  4.      * @see com.opensymphony.xwork2.interceptor.AbstractInterceptor#intercept(com.opensymphony.xwork2.ActionInvocation) 
  5.      */  
  6.     @Override  
  7.     public String intercept(ActionInvocation invocation) throws Exception {  
  8.   
  9.         ActionContext actionContext = invocation.getInvocationContext();  
  10.         HttpServletRequest request = (HttpServletRequest) actionContext  
  11.             .get(StrutsStatics.HTTP_REQUEST);  
  12.         Map<String, Object> session = actionContext.getSession();  
  13.   
  14.         //首先判断session,查找是否登录成功,通过拦截器  
  15.         if (session != null && session.get(CommonConstants.SESSION_KEY_USER_NAME) != null) {  
  16.             logger.info("通过拦截器,session中有记录[" + session.get(CommonConstants.SESSION_KEY_USER_NAME)  
  17.                         + "]");  
  18.             return invocation.invoke();  
  19.         }  
  20.   
  21.         //其次cookie验证,是否有记住的登录状态  
  22.         Cookie[] cookies = request.getCookies();  
  23.         if (cookies != null) {  
  24.             for (Cookie cookie : cookies) {  
  25.                 if (logger.isDebugEnabled())  
  26.                     logger.debug("读取cookie项[" + cookie.getName() + "]");  
  27.   
  28.                 if (CommonConstants.COOKIE_KEY_REMEMBER_LOGIN.equals(cookie.getName())) {  
  29.                     String value = cookie.getValue();  
  30.                     if (StringUtils.isNotBlank(value)) {  
  31.                         String[] split = value.split(",");  
  32.                         String name = split[0];  
  33.                         String password = split[1];  
  34.   
  35.                         if (userLoginManager.checkLogin(name, password)) {  
  36.                             //check name/password from cookie success  
  37.                             logger.info("通过拦截器,cookie中有记录[" + name + "]");  
  38.                             session.put(CommonConstants.SESSION_KEY_USER_NAME, name);  
  39.                             return invocation.invoke();  
  40.                         } else {  
  41.                             //check name/password from cookie failure  
  42.                             setGoingToURL(session, invocation);  
  43.                             return Action.LOGIN;  
  44.                         }  
  45.                     } else {  
  46.                         setGoingToURL(session, invocation);  
  47.                         return Action.LOGIN;  
  48.                     }  
  49.                 }  
  50.             }  
  51.         }  
  52.   
  53.         setGoingToURL(session, invocation);  
  54.         return Action.LOGIN;  
  55.     }  
  56.   
  57.     private void setGoingToURL(Map<String, Object> session, ActionInvocation invocation) {  
  58.         String url = "";  
  59.         String namespace = invocation.getProxy().getNamespace();  
  60.   
  61.         if (StringUtils.isNotBlank(namespace) && !namespace.equals("/")) {  
  62.             url = url + namespace;  
  63.         }  
  64.   
  65.         String actionName = invocation.getProxy().getActionName();  
  66.         if (StringUtils.isNotBlank(actionName)) {  
  67.             url = url + "/" + actionName + ".action";  
  68.         }  
  69.   
  70.         if (logger.isDebugEnabled())  
  71.             logger.debug("拼接登录前URL,结果:" + CommonConstants.SESSION_KEY_URL_BEFORE_LOGIN + "[" + url  
  72.                          + "]");  
  73.         session.put(CommonConstants.SESSION_KEY_URL_BEFORE_LOGIN, url);  
  74.     }  
  75.   
  76.     //... getter & setter methods  
  77. }  

LoginInterceptor.java遇到的问题:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我为您修改了代码,将账号设置为"redrock",密码设置为"123456",并且在用户登录成功时输出"登录成功"。请查看以下修改后的代码: ```go package main import ( "bufio" "crypto/md5" "encoding/hex" "fmt" "os" "strings" ) var reader = bufio.NewReader(os.Stdin) // GetUserCredentials 获取用户输入的账号密码 func GetUserCredentials() (string, string) { var username, password string fmt.Print("请输入用户名:") userInput, _ := reader.ReadString('\n') username = strings.TrimSpace(userInput) fmt.Print("请输入密码:") passwordInput, _ := reader.ReadString('\n') password = strings.TrimSpace(passwordInput) return strings.TrimSpace(username), strings.TrimSpace(password) } // MD5Hash 对密码进行 MD5 加密 func MD5Hash(password string) string { hash := md5.Sum([]byte(password)) return hex.EncodeToString(hash[:]) } // UserLogin 处理用户登录 func UserLogin(username, password string) bool { // 假设存储的用户名和密码都已经进行了 MD5 加密 if username == "redrock" && password == "e10adc3949ba59abbe56e057f20f883e" { return true } return false } func main() { username, password := GetUserCredentials() if UserLogin(username, MD5Hash(password)) { fmt.Println("登录成功") // 用户登录成功,继续执行其他逻辑 } else { fmt.Println("用户名或密码错误") // 用户登录失败,进行错误处理 } } ``` 修改后的代码中,将账号设置为"redrock",密码设置为"123456",并且在`UserLogin`函数中,比较的密码是经过MD5加密的结果。在`main`函数中,调用了`MD5Hash`函数对用户输入的密码进行加密后再进行登录验证。 现在,当您输入账号为"redrock",密码为"123456"时,程序会提示登录成功

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值