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

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

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

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

  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. }  
package com.hsinghsu.test.interceptor;

import com.opensymphony.xwork2.*;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;

public class UserInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 4956767125951165062L;

	// 拦截Action处理的拦截方法
	public String intercept(ActionInvocation invocation) throws Exception {

		// 取得请求相关的ActionContext实例
		ActionContext ctx = invocation.getInvocationContext();
		Map<String, Object> session = ctx.getSession();
		// 取出名为user的Session属性
		String user = (String) session.get("user");

		// 如果已经登录,放行
		if (user != null && user.equals("hsing")) {
			return invocation.invoke();
		}

		// 获取HttpServletRequest对象
		HttpServletRequest req = ServletActionContext.getRequest();

		// 获取此请求的地址
		String path = req.getRequestURI();
		System.out.println("path:" + path);
		// 存入session,方便调用
		session.put("prePage", path);

		// 没有登录,将服务器提示设置成一个HttpServletRequest属性
		ctx.put("tip", "您还没有登录,请输入hsing,hsu登录系统");

		// 直接返回login的逻辑视图
		return "login";
	}
}
新建登录action,LoginAction.java代码如下:
  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. }  
package com.hsinghsu.test.action;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ActionContext;

import java.util.*;

public class LoginAction extends ActionSupport {

	private static final long serialVersionUID = 8013816027944871760L;
	private String username;// 登录用户名
	private String password;// 登录密码
	private String prePage;// 登录前页面

	public String execute() throws Exception {
		
		if (null != username && null != password && username.equals("hsing") && password.equals("hsu")) {

			ActionContext ctx = ActionContext.getContext();
			Map<String, Object> session = ctx.getSession();
			
			//保存用户信息session
			session.put("user", getUsername());

			// 获取跳转到登陆界面之前的页面地址,由拦截器提供
			prePage = (String) session.get("prePage");

			// 清除session中的数据
			session.remove("prePage");

			if (null == prePage) {
				return "usercenter";// 不是拦截器跳转到登陆页面的,直接访问的登陆页面
			} else {
				return SUCCESS;// 是拦截器跳转到登陆登录前页面
			}

		} else {
			return INPUT;
		}
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getUsername() {
		return this.username;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getPassword() {
		return this.password;
	}

	public String getPrePage() {
		return prePage;
	}

	public void setPrePage(String prePage) {
		this.prePage = prePage;
	}
}
配置拦截器与action映射关系,struts.xml代码如下:
  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>  
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
	"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
	<constant name="struts.custom.i18n.resources" value="globalMessages" />
	<constant name="struts.i18n.encoding" value="UTF-8" />

	<package name="hsinghsu" extends="struts-default">
	
		<!-- 用户拦截器定义 -->
		<interceptors>
			<interceptor name="userInterceptor" class="com.hsinghsu.test.interceptor.UserInterceptor" />
		</interceptors>

		<!-- 定义全局result -->
		<global-results>
			<result name="login">/jsp/login.jsp</result>
		</global-results>

		<action name="loginPro" class="com.hsinghsu.test.action.LoginAction">
			<result name="success" type="redirectAction">${prePage}</result>
			<result name="input">/jsp/login.jsp</result>
			<result name="usercenter">/jsp/userCenter.jsp</result>
		</action>
		
		<action name="productList">
			<result name="success">/jsp/productList.jsp</result>
			<interceptor-ref name="defaultStack" /> <!-- 默认拦截器 -->
			<interceptor-ref name="userInterceptor" /> <!-- 应用自定义拦截器 -->
		</action>
		
	</package>
</struts>
登录页面login.jsp代码如下:
  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>  
<%@ page contentType="text/html; charset=utf-8" language="java"
	errorPage=""%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>登录页面</title>
</head>
<body>
	<h3>用户登录</h3>
	${tip}
	<s:form action="loginPro">
		<s:textfield name="username" label="用户名" />
		<s:password name="password" label="密码" />
		<s:submit value="登录" />
	</s:form>
</body>
</html>
产品列表页面productList.jsp代码如下:
  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>  
<%@ page contentType="text/html; charset=utf-8" language="java"
	errorPage=""%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>产品列表</title>
</head>
<body>
	<h2>水果:</h2>
	苹果<br/> 橘子<br/> 香蕉<br/>
</body>
</html>
用户中心userCenter.jsp代码如下:
  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>  
<%@ page contentType="text/html; charset=utf-8" language="java"
	errorPage=""%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>成功页面</title>
</head>
<body>个人用户中心,您已经登录!
</body>
</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前台展现页面。
目录
相关文章
SpringMVC自定义注解验证登陆拦截
这里业务场景需要,所有的请求都需要登录验证。个别通用业务不需要登录拦截。注解方式替代原有的if判断。
SpringMVC自定义注解验证登陆拦截
|
前端开发 Java 数据安全/隐私保护
SpringMVC拦截器实现登录权限控制
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。 依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于 web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller生命周期之内可以多次调用。
JavaWeb - 过滤器之登录
JavaWeb - 过滤器之登录
81 0
SSM项目使用拦截器实现登录验证功能
本文讲解SSM项目使用拦截器实现登录验证功能,希望对大家有所帮助。
161 0
SSM项目使用拦截器实现登录验证功能
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)上
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)
131 0
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)上
|
Java 数据安全/隐私保护 容器
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)下
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)
144 0
Struts2拦截器的简单应用,登录权限拦截器及与过滤器的区别(八)下
|
前端开发 Java Spring
springMVC使用拦截器检查用户登录
参考文章 编写拦截器类 package cultivate_web.interceptor; import javax.servlet.http.HttpServletRequest; import javax.
1228 0
|
安全 Java
Springsecurity搭建自定义登录页面
Springsecurity搭建自定义登录页面 1.springSecurity的搭建 新建一个springboot的web项目,我这边只选中了web,建立后如下: image.
4324 0