我们知道每个用户登录都会相应的产生一个session,在webwork中我们经常是把对象直接put该user对象进session.我们也可以通过这个session获取的该对象所有数据.
但是在该session中存在的对象是put()时的对象,而不是与数据库同步更新的对象,即当我们update数据库中的数据该session中的数据会保持不变.我所遇到的问题就是由此产生的。
我这两天发了一篇帖子关于单用户登录,具体算法与实践都已经实施完成。并且在单独的action中也测试过这个单用户登录的功能。可是当我准备把它写成拦截器时,因为上述的那个问题,致使拦截器中代码条件永远满足
public String intercept(ActionInvocation invocation) throws Exception {
Customer customer =(Customer) invocation.getInvocationContext().getSession().get("customer");
if(customer!=null){
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
String hashcode=session.getId();
if(hashcode!=null){
String hashcodetemp=customer.getPointcode();
if(hashcodetemp.equals(hashcode)){
ThreadLocalUser.set(customer);
String result = invocation.invoke();
ThreadLocalUser.set(null);
return result;
}
ActionContext.getContext().getSession().clear();
ActionSupport action = (ActionSupport) invocation.getAction();
action.addActionError("^o^你的账号已经在其它地方登录^o^");
return Action.LOGIN;
}
ActionSupport action = (ActionSupport) invocation.getAction();
return Action.LOGIN;
}
return Action.LOGIN;
}
这就是我的拦截器代码 最主要的错误出现在这里
String hashcodetemp=customer.getPointcode();
由于上述session中的问题,致使这个条件基本上永远满足。
因为只有这个customer对象是从数据库中查阅的,那么才能使得这个条件有判断作用。我也尝试过使用接口中的方法通过这个customerid来获得数据库中该对象.可一直达不到满足情况。另外我在测试action中测试过这个算法,具体代码如下,(效果成功)
HttpServletRequest request=(HttpServletRequest)ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);//获得requset
HttpSession session = request.getSession();
session.getId();
if(!session.getId().equals(customer.getPointcode())){
ActionContext.getContext().getSession().clear();
this.addActionMessage("^o^当前账户已经在其他地方登录,请重新登录^o^");
return INPUT;
}
希望有兴趣或有这种经验的一起来探讨解决下
分享到:
相关推荐
springboot利用拦截器打印各个接口的响应时间,快速统计各接口执行速度,方便接口优化。springboot利用拦截器打印各个接口的响应时间,快速统计各接口执行速度,方便接口优化。springboot利用拦截器打印各个接口的响应...
然后,要将拦截器加入到SpringBoot的配置中,需要使用WebMvcConfigurer接口的addInterceptors方法。具体配置代码如下: ```java import org.springframework.context.annotation.Configuration; import org.spring...
1. 创建自定义拦截器类:你需要创建一个实现了`HandlerInterceptor`接口的类,这个接口包含三个方法:`preHandle()`, `postHandle()`, 和 `afterCompletion()`。这些方法会在请求生命周期的不同阶段被调用。 ```...
在Struts 2中,拦截器的配置主要通过XML配置文件进行,例如在struts-default.xml中,可以定义全局拦截器堆栈,也可以在特定Action的配置中指定局部拦截器。通过这种方式,开发者可以根据需求自定义拦截器链,实现...
### Struts2拦截器的使用方法 #### 一、Struts2拦截器概述 Struts2框架中的拦截器(Interceptor)是一种重要的机制,用于在Action执行前后进行一系列处理,比如参数验证、数据预处理等。它能够帮助开发者更加灵活...
拦截器在CXF中的工作原理基于JAX-WS规范,可以分为两种类型:`InInterceptors`(入站拦截器)和`OutInterceptors`(出站拦截器)。入站拦截器处理从客户端到服务器的消息,而出站拦截器则处理从服务器返回到客户端的...
1. **创建拦截器类**:首先,我们需要创建一个实现了Spring MVC的HandlerInterceptor接口的拦截器类。在这个类中,我们需要重写`preHandle`、`postHandle`和`afterCompletion`这三个方法。 2. **配置拦截器**:在...
在上面的代码中,我们可以看到请求拦截器的使用方法: ``` axios.interceptors.request.use(function (config) { // 在发送请求之前做些什么 // ... return config }, function (error) { // 对请求错误做些什么...
本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。
要使用MyBatis拦截器,我们需要在Spring配置文件中添加拦截器的配置。 ```xml <value>classpath*:xmlmapper/*.xml <value>classpath*:resources/xmlmapper/*.xml ``` 注意事项 在使用...
在request.js文件中,作者使用了axios.create方法创建了一个axios实例,并在其中添加了拦截器,以便统一处理接口。在api.js文件中,作者定义了一个getPersonInfo函数,该函数使用axios实例来调用接口。然后,在index...
通过`addInterceptors(InterceptorRegistry registry)`方法添加自定义的拦截器,然后使用`registry.addInterceptor(interceptor)`方法将拦截器实例注册到注册表中。配置完成后,拦截器会按照添加的顺序依次执行。 5...
5. **自定义逻辑**:在自定义拦截器的`handleMessage`或`handleFault`方法中,你可以添加任何你需要的业务逻辑,例如验证请求头、修改消息内容或记录操作日志。 6. **调试和测试拦截器**:为了确保拦截器按预期工作...
在压缩包文件`Struts2_Interceptor`中,可能包含了关于Struts2拦截器使用的示例代码、解释文档或者教程,你可以进一步研究这些资源,以便更深入地理解并掌握Struts2拦截器的用法。学习如何创建自定义拦截器,以及...
在这个系列的第二部分,我们将深入探讨如何使用 Castle AOP 对接口方法调用进行拦截。首先,我们需要理解 Castle AOP 的核心组件,即拦截器(Interceptor)和代理(Proxy)。拦截器是执行特定任务的类,而代理则是被...
在本文中,我们讨论了三种解决SpringMVC拦截器拦截静态资源文件的方法,并对这些方法的优劣进行了分析。 方案一是在拦截器中排除静态资源路径。在SpringMVC的配置文件中(通常是spring-mvc.xml),可以通过配置元素...
### 使用拦截器解决中文乱码 ...在Struts2框架中,使用自定义拦截器解决中文乱码问题是一种高效且实用的方法。通过本教程的学习,开发者能够快速掌握如何实现这一功能,从而提升Web应用程序的用户体验。
如果你希望在拦截器中处理404错误,你可以在`preHandle`或`postHandle`方法中检查请求路径,如果找不到对应的Controller方法,可以手动设置响应状态码为404并返回自定义的错误信息。 对于500错误,SpringBoot同样...