拦截器从字面意思来看就是限制,限制用户访问某些网页。在Action提出请求之前用拦截器来做权限设置,让符合的用户跳入相应的界面中。最近做的一个商城项目中就用到了自定义的拦截器,实现了一个简单的session判断,成功就登陆,不成功就跳转到门户。
【拦截器工作原理】
Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
我的理解是每一个action请求都会在拦截器的内部,当发生请求的时候,Struts会找对应的配置文件,实例化相应的拦截器对象,如设置拦截器属性excludeMethods。很类似于过滤器的,但是过滤器的范围要大于拦截器。
【创建拦截器】
第一种方法就是直接实现Interceptor接口,这样的话,有个弊端,这里面的init() destroy() intercept() 方法都需要实现了。
第二种方法是继承自AbstractInterceptor抽象类,实现了Interceptor接口,并且对里面的init()和destroy()方法进行空实现,而把intercept()方法设置为抽象方法,让继承它的子类去实现,这样的话,子类只要实现这个intercept()方法就可以了,比上面的简单。
第三种方法是继承自MethodFilterInterceptor(我下面就是用这个方法实现的),这个类叫做方法过滤拦截器,MethodFilterInterceptor继承自AbstractInterceptor,并且提供了一种机制,即可以指定对Action中某些方法进行拦截或者是不拦截,所谓拦截不拦截,指的就是拦截器中的intercept()方法是否被执行了,若没有执行,就是没有拦截,若执行了,就是拦截了。
总的来说,相比之前的接口和抽象类,最后一个只需要指定对Action中某些方法进行拦截是最简单的。是通过includeMethods和excludeMethods这两个参数来设置那个方法需要拦截的,在Struts.xml中进行配置。
【拦截器实现登陆】
1>首先我们要自定义一个拦截器类:
package com.lyq.action.interceptor;
import java.util.Map;
import com.lyq.action.BaseAction;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
/**
* 消费者登录拦截器
* @author Li Yongqiang
*
*/
public class CustomerLoginInteceptor extends AbstractInterceptor{
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext context = invocation.getInvocationContext();// 获取ActionContext
Map<String, Object> session = context.getSession();// 获取Map类型的session
if(session.get("customer") != null){// 判断用户是否登录
return invocation.invoke();// 调用执行方法
}
return BaseAction.CUSTOMER_LOGIN;// 返回登录
}
}
2>然后在配置文件中去注册这个拦截器,并在后台登陆的action中利用excludeMethods这个成员变量来绑定login这个方法被拦截。(structs-front.xml 哪个方法需要拦截,就在哪儿引用拦截器)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd" >
<struts>
<!-- 前台登录 -->
<package name="shop.front" extends="shop-default">
<!-- 配置拦截器 -->
<interceptors>
<interceptor name="loginInterceptor" class="com.lyq.action.interceptor.CustomerLoginInteceptor"/>
<interceptor-stack name="customerDefaultStack">
<interceptor-ref name="loginInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<action name="index" class="indexAction">
<result>/WEB-INF/pages/index.jsp</result>
</action>
</package>
<!-- 消费者Action -->
<package name="shop.customer" extends="shop-default" namespace="/customer">
<action name="customer_*" method="{1}" class="customerAction">
<result name="input">/WEB-INF/pages/user/customer_reg.jsp</result>
</action>
</package>
<!-- 商品Action -->
<package name="shop.product" extends="shop-default" namespace="/product">
<action name="product_*" class="productAction" method="{1}">
<result name="list">/WEB-INF/pages/product/product_list.jsp</result>
<result name="select">/WEB-INF/pages/product/product_select.jsp</result>
<result name="clickList">/WEB-INF/pages/product/product_click_list.jsp</result>
<result name="findList">/WEB-INF/pages/product/product_find_list.jsp</result>
</action>
</package>
<!-- 购物车Action 这里配置了定义的拦截器 -->
<package name="shop.cart" extends="shop.front" namespace="/product">
<action name="cart_*" class="cartAction" method="{1}">
<result name="list">/WEB-INF/pages/cart/cart_list.jsp</result>
<interceptor-ref name="customerDefaultStack"/>
</action>
</package>
<!-- 订单Action 这里配置了定义的拦截器-->
<package name="shop.order" extends="shop.front" namespace="/product">
<action name="order_*" class="orderAction" method="{1}">
<result name="add">/WEB-INF/pages/order/order_add.jsp</result>
<result name="confirm">/WEB-INF/pages/order/order_confirm.jsp</result>
<result name="list">/WEB-INF/pages/order/order_list.jsp</result>
<result name="error">/WEB-INF/pages/order/order_error.jsp</result>
<interceptor-ref name="customerDefaultStack"/>
</action>
</package>
</struts>
3>然后是在login 这个方法被调用的时候,就去验证session是不是空的,来判断是否有这个用户名和密码的匹配,然后放入了session中。
package com.lyq.action.user;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.lyq.action.BaseAction;
import com.lyq.model.user.Customer;
import com.lyq.util.AppException;
import com.opensymphony.xwork2.ModelDriven;
/**
* 顾客Action
* @author Li Yongqiang
*/
@Scope("prototype")
@Controller("customerAction")
public class CustomerAction extends BaseAction implements ModelDriven<Customer>{
private static final long serialVersionUID = 1L;
public String login() throws Exception{
return CUSTOMER_LOGIN;
}
/**
* 用户注册
* @return
* @throws Exception
*/
public String save() throws Exception{
boolean unique = customerDao.isUnique(customer.getUsername());//判断用户名是否可用
if(unique){//如果用户名可用
customerDao.save(customer);//保存注册信息
return CUSTOMER_LOGIN;//返回会员登录页面
}else{
throw new AppException("此用户名不可用");//否则返回页面错误信息
}
}
/**
* 用户登录
* @return
* @throws Exception
*/
public String logon() throws Exception{
//验证用户名和密码是否正确
Customer loginCustomer = customerDao.login(customer.getUsername(), customer.getPassword());
if(loginCustomer != null){//如果通过验证
session.put("customer", loginCustomer);//将登录会员信息保存在Session中
}else{//验证失败
addFieldError("", "用户名或密码不正确!");//返回错误信息
return CUSTOMER_LOGIN;//返回会员登录页面
}
return INDEX;//返回网站首页
}
/**
* 用户退出
* @return String
* @throws Exception
*/
public String logout() throws Exception{
if(session != null && session.size() > 0){
session.clear();
}
return INDEX;
}
// 管理员
private Customer customer = new Customer();
// 确认密码
private String repassword;
public Customer getCustomer() {
return customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public String getRepassword() {
return repassword;
}
public void setRepassword(String repassword) {
this.repassword = repassword;
}
@Override
public Customer getModel() {
return customer;
}
}
分享到:
相关推荐
这篇博客“struts2 拦截器实现登录控制”显然会探讨如何利用拦截器来实现用户登录验证,从而保护应用程序的受保护资源。 首先,我们了解下Struts2拦截器的工作原理。拦截器是基于AOP(面向切面编程)的概念,它位于...
在本项目中,"struts2拦截器"被用来实现分限制游客浏览和会员浏览的功能。这通常涉及到用户身份验证和授权。例如,某些页面可能只对登录的会员开放,而其他页面则允许所有访客查看。拦截器在这种情况下可以检查当前...
在文件上传场景中,Struts拦截器可以起到关键作用,确保上传的安全性和有效性。 文件上传是Web应用中的常见功能,它允许用户将本地文件传输到服务器。在Struts中,文件上传通常涉及以下知识点: 1. **Struts拦截器...
在struts.xml配置文件中,你可以通过`<interceptors>`标签定义拦截器栈,并通过`<action>`标签中的`interceptor-ref`指定使用哪些拦截器。 然后,我们关注的是**校验(Validation)**。Struts2提供了基于注解和XML...
Struts 2.0 是一个基于MVC设计模式的Java Web框架,它的核心功能之一是拦截器(Interceptor),这是实现业务逻辑控制和增强应用程序功能的重要组件。在Struts 2中,拦截器扮演着中间人的角色,它们在Action调用前后...
在JavaEE开发中,拦截器...总之,`JavaEE 拦截器用户登录案例源代码`这个主题涉及到如何使用拦截器进行用户登录验证,通过学习这个案例,开发者可以更好地理解拦截器的原理和应用,提升Web应用的安全性和用户体验。
在Struts2中,拦截器(Interceptor)是实现业务逻辑控制和增强功能的重要组件,尤其是在权限控制方面。本文将深入探讨Struts2拦截器如何帮助我们实现精细的权限控制,并通过实际例子进行说明。 首先,理解Struts2...
在Struts2中,拦截器是实现业务逻辑和表示层解耦的重要工具,它们允许开发者在请求到达Action之前或之后执行特定的操作。本示例主要探讨的是如何使用Struts2的拦截器来处理文件上传功能。 首先,我们来理解一下...
综上所述,拦截器和过滤器在Web开发中各自扮演着重要角色,而文件上传作为常见的业务需求,可以通过Struts2框架中的拦截器机制进行高效且安全的实现。理解它们的工作原理和区别,有助于提高开发效率和代码质量。
- 在Struts的配置文件(如`struts-config.xml`或`struts2.xml`)中,可以自定义拦截器来处理文件大小限制。例如,在Struts 2中,可以使用`FileUploadInterceptor`并设定`maximumSize`属性。 3. **Java代码控制**:...
Hibernate和Struts2都提供了一些安全相关的工具和插件,例如使用预编译的SQL(PreparedStatement)来防止SQL注入,以及使用过滤器和拦截器来防止恶意脚本。 综上所述,这个项目展示了如何结合使用Hibernate和Struts...
通常,可以通过编写Spring Security或Struts2拦截器来实现这一功能。拦截器会检查用户是否已登录,如果未登录则重定向到登录页面。同时,也可以设置登录尝试次数限制,超过次数后锁定账号。 5. **注册登录验证** ...
- Struts2的拦截器(Interceptor)机制可以用于添加额外的逻辑,例如记录日志、权限检查等。在本示例中,可能需要一个专门处理文件下载的拦截器。 7. **JSP或Freemarker模板**: - 最后,创建一个简单的JSP页面或...
- 在用户登录场景中,可能会使用预定义的拦截器如Params拦截器来处理请求参数。 7. **表单提交与Action映射**: - 用户在JSP页面填写完登录信息后,点击提交,表单数据通过HTTP POST请求发送到服务器。 - Struts...
3. **图片上传处理**:在Struts2中,通常会有一个专门处理文件上传的Action,它需要继承`org.apache.struts2.interceptor.FileUploadInterceptor`拦截器,以支持文件上传。用户上传的图片会被暂时存储在服务器的一个...
在"Struts2拦截器学习.doc"中,可能会详细讲解如何定义、配置和使用拦截器,包括在struts.xml配置文件中声明拦截器,以及使用@InterceptorRef注解在Action类中引用拦截器。 接下来是Common-FileUpload组件。在...
使用Struts2的拦截器实现文件的下载 为了增加灵活性,可以使用Struts2拦截器处理文件下载。创建一个拦截器,检查文件路径的合法性,然后在`intercept()`方法中设置响应头并读取文件。这样可以实现统一的下载逻辑,...