Struts 拦截器权限控制【通过拦截器实现登录后跳转到登录前页面】

用情形:在web项目中,经常会遇到用户未登录或SESSION失效时用户发出非法的权限操作,如新闻的评论、文件的下载等等,在此我们可以使用struts拦截器对该用户发出的请求进行拦截,拦截后判断用户是否登录或SESSION是否有效,然后进行其正常操作。具体实例如下:

新建一个拦截器类UserInterceptor ,UserInterceptor.java代码如下

[java]  view plain copy
  1. package com.hsinghsu.test.interceptor;  
  2.   
  3. import com.opensymphony.xwork2.*;  
  4. import com.opensymphony.xwork2.interceptor.AbstractInterceptor;  
  5. import java.util.*;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import org.apache.struts2.ServletActionContext;  
  8.   
  9. public class UserInterceptor extends AbstractInterceptor {  
  10.   
  11.     private static final long serialVersionUID = 4956767125951165062L;  
  12.   
  13.     // 拦截Action处理的拦截方法  
  14.     public String intercept(ActionInvocation invocation) throws Exception {  
  15.   
  16.         // 取得请求相关的ActionContext实例  
  17.         ActionContext ctx = invocation.getInvocationContext();  
  18.         Map<String, Object> session = ctx.getSession();  
  19.         // 取出名为user的Session属性  
  20.         String user = (String) session.get("user");  
  21.   
  22.         // 如果已经登录,放行  
  23.         if (user != null && user.equals("hsing")) {  
  24.             return invocation.invoke();  
  25.         }  
  26.   
  27.         // 获取HttpServletRequest对象  
  28.         HttpServletRequest req = ServletActionContext.getRequest();  
  29.   
  30.         // 获取此请求的地址  
  31.         String path = req.getRequestURI();  
  32.         System.out.println("path:" + path);  
  33.         // 存入session,方便调用  
  34.         session.put("prePage", path);  
  35.   
  36.         // 没有登录,将服务器提示设置成一个HttpServletRequest属性  
  37.         ctx.put("tip""您还没有登录,请输入hsing,hsu登录系统");  
  38.   
  39.         // 直接返回login的逻辑视图  
  40.         return "login";  
  41.     }  
  42. }  
新建登录action,LoginAction.java代码如下:
[java]  view plain copy
  1. package com.hsinghsu.test.action;  
  2.   
  3. import com.opensymphony.xwork2.ActionSupport;  
  4. import com.opensymphony.xwork2.ActionContext;  
  5.   
  6. import java.util.*;  
  7.   
  8. public class LoginAction extends ActionSupport {  
  9.   
  10.     private static final long serialVersionUID = 8013816027944871760L;  
  11.     private String username;// 登录用户名  
  12.     private String password;// 登录密码  
  13.     private String prePage;// 登录前页面  
  14.   
  15.     public String execute() throws Exception {  
  16.           
  17.         if (null != username && null != password && username.equals("hsing") && password.equals("hsu")) {  
  18.   
  19.             ActionContext ctx = ActionContext.getContext();  
  20.             Map<String, Object> session = ctx.getSession();  
  21.               
  22.             //保存用户信息session  
  23.             session.put("user", getUsername());  
  24.   
  25.             // 获取跳转到登陆界面之前的页面地址,由拦截器提供  
  26.             prePage = (String) session.get("prePage");  
  27.   
  28.             // 清除session中的数据  
  29.             session.remove("prePage");  
  30.   
  31.             if (null == prePage) {  
  32.                 return "usercenter";// 不是拦截器跳转到登陆页面的,直接访问的登陆页面  
  33.             } else {  
  34.                 return SUCCESS;// 是拦截器跳转到登陆登录前页面  
  35.             }  
  36.   
  37.         } else {  
  38.             return INPUT;  
  39.         }  
  40.     }  
  41.   
  42.     public void setUsername(String username) {  
  43.         this.username = username;  
  44.     }  
  45.   
  46.     public String getUsername() {  
  47.         return this.username;  
  48.     }  
  49.   
  50.     public void setPassword(String password) {  
  51.         this.password = password;  
  52.     }  
  53.   
  54.     public String getPassword() {  
  55.         return this.password;  
  56.     }  
  57.   
  58.     public String getPrePage() {  
  59.         return prePage;  
  60.     }  
  61.   
  62.     public void setPrePage(String prePage) {  
  63.         this.prePage = prePage;  
  64.     }  
  65. }  
配置拦截器与action映射关系,struts.xml代码如下:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.1.7.dtd">  
  5. <struts>  
  6.     <constant name="struts.custom.i18n.resources" value="globalMessages" />  
  7.     <constant name="struts.i18n.encoding" value="UTF-8" />  
  8.   
  9.     <package name="hsinghsu" extends="struts-default">  
  10.       
  11.         <!-- 用户拦截器定义 -->  
  12.         <interceptors>  
  13.             <interceptor name="userInterceptor" class="com.hsinghsu.test.interceptor.UserInterceptor" />  
  14.         </interceptors>  
  15.   
  16.         <!-- 定义全局result -->  
  17.         <global-results>  
  18.             <result name="login">/jsp/login.jsp</result>  
  19.         </global-results>  
  20.   
  21.         <action name="loginPro" class="com.hsinghsu.test.action.LoginAction">  
  22.             <result name="success" type="redirectAction">${prePage}</result>  
  23.             <result name="input">/jsp/login.jsp</result>  
  24.             <result name="usercenter">/jsp/userCenter.jsp</result>  
  25.         </action>  
  26.           
  27.         <action name="productList">  
  28.             <result name="success">/jsp/productList.jsp</result>  
  29.             <interceptor-ref name="defaultStack" /> <!-- 默认拦截器 -->  
  30.             <interceptor-ref name="userInterceptor" /> <!-- 应用自定义拦截器 -->  
  31.         </action>  
  32.           
  33.     </package>  
  34. </struts>  
登录页面login.jsp代码如下:
[html]  view plain copy
  1. <%@ page contentType="text/html; charset=utf-8" language="java"  
  2.     errorPage=""%>  
  3. <%@ taglib prefix="s" uri="/struts-tags"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  5.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <title>登录页面</title>  
  9. </head>  
  10. <body>  
  11.     <h3>用户登录</h3>  
  12.     ${tip}  
  13.     <s:form action="loginPro">  
  14.         <s:textfield name="username" label="用户名" />  
  15.         <s:password name="password" label="密码" />  
  16.         <s:submit value="登录" />  
  17.     </s:form>  
  18. </body>  
  19. </html>  
产品列表页面productList.jsp代码如下:
[html]  view plain copy
  1. <%@ page contentType="text/html; charset=utf-8" language="java"  
  2.     errorPage=""%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  4.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <html xmlns="http://www.w3.org/1999/xhtml">  
  6. <head>  
  7. <title>产品列表</title>  
  8. </head>  
  9. <body>  
  10.     <h2>水果:</h2>  
  11.     苹果<br/> 橘子<br/> 香蕉<br/>  
  12. </body>  
  13. </html>  
用户中心userCenter.jsp代码如下:
[html]  view plain copy
  1. <%@ page contentType="text/html; charset=utf-8" language="java"  
  2.     errorPage=""%>  
  3. <%@ taglib prefix="s" uri="/struts-tags"%>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  5.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  6. <html xmlns="http://www.w3.org/1999/xhtml">  
  7. <head>  
  8. <title>成功页面</title>  
  9. </head>  
  10. <body>个人用户中心,您已经登录!  
  11. </body>  
  12. </html>  
验证:
情形一:若用户未登录,输入http://localhost:8686/testInterceptor/productList.action
则系统会自动跳转到login.jsp页面,进行用户登录,登录后系统会自动跳到productList.jsp前台展现页面。
情形二:若用户已登录,输入http://localhost:8686/testInterceptor/productList.action
则系统直接跳转到productList.jsp前台展现页面。
情形三:若用户未登录,输入http://localhost:8686/testInterceptor/testInterceptor/loginPro.action
则系统会自动跳转到login.jsp页面,进行用户登录,登录后系统会自动跳到userCenter.jsp前台展现页面。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值