求助struts2 struts2拦截器跳转转登录页面问题

2013年10月 Java大版内专家分月排行榜第二2013年3月 Java大版内专家分月排行榜第二2013年2月 Java大版内专家分月排行榜第二
2013年7月 Java大版内专家分月排行榜第三2013年5月 Java大版内专家分月排行榜第三2013年4月 Java大版内专家分月排行榜第三
2013年10月 Java大版内专家分月排行榜第二2013年3月 Java大版内专家分月排行榜第二2013年2月 Java大版内专家分月排行榜第二
2013年7月 Java大版内专家分月排行榜第三2013年5月 Java大版内专家分月排行榜第三2013年4月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。在struts2中使用拦截器(Interceptor)控制登录和权限 - 邓胤的家当 - ITeye技术网站
博客分类:
在jsp servlet中我们通常使用Servlet Filter控制用户是否登入, 是否有权限转到某个页面。在struts2中我们应该会想到他的拦截器(Interceptor), Interceptor在struts2中起着非常重要的作用。 很多struts2中的功能都是使用Interceptor实现的。
需求:简单的登入界面,让用户输入用户名、密码、记住密码(remember me)。 如果用户选中remember me的话, 下次就不需要再登入了(使用cookie实现, 用需要点击logout取消remeber me功能)。 如果用户起始输入的地址不是登入页面的话,在用户登入之后需要转到用户输入的起始地址。
我们先看看LoginInterceptor.java
package com.javaeye.dengyin2000.wallet.
import java.util.M
import javax.servlet.http.C
import javax.servlet.http.HttpServletR
import mons.lang.StringU
import org.apache.struts2.StrutsS
import com.javaeye.dengyin2000.wallet.dao.UserDAO;
import com.javaeye.dengyin2000.wallet.dao.UserNotFoundE
import com.javaeye.dengyin2000.wallet.domains.U
import com.opensymphony.xwork2.ActionC
import com.opensymphony.xwork2.ActionI
import com.opensymphony.xwork2.interceptor.AbstractI
public class LoginInterceptor extends AbstractInterceptor {
public static final String USER_SESSION_KEY="wallet.session.user";
public static final String COOKIE_REMEMBERME_KEY="wallet.cookie.rememberme";
public static final String GOING_TO_URL_KEY="GOING_TO";
private UserDAO userD
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext actionContext = invocation.getInvocationContext();
HttpServletRequest request= (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);
Map session = actionContext.getSession();
if (session != null && session.get(USER_SESSION_KEY) != null){
return invocation.invoke();
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
if (COOKIE_REMEMBERME_KEY.equals(cookie.getName())) {
String value = cookie.getValue();
if (StringUtils.isNotBlank(value)) {
String[] split = value.split("==");
String userName = split[0];
String password = split[1];
User user = userDao
.attemptLogin(userName, password);
session.put(USER_SESSION_KEY, user);
} catch (UserNotFoundException e) {
setGoingToURL(session, invocation);
return "login";
setGoingToURL(session, invocation);
return "login";
return invocation.invoke();
setGoingToURL(session, invocation);
return "login";
private void setGoingToURL(Map session, ActionInvocation invocation){
String url = "";
String namespace = invocation.getProxy().getNamespace();
if (StringUtils.isNotBlank(namespace) && !namespace.equals("/")){
url = url +
String actionName = invocation.getProxy().getActionName();
if (StringUtils.isNotBlank(actionName)){
url = url + "/" + actionName + ".action";
session.put(GOING_TO_URL_KEY, url);
public UserDAO getUserDao() {
return userD
public void setUserDao(UserDAO userDao) {
this.userDao = userD
首先判断session中有没有用户信息, 如果有的话继续, 如果没有的话,检查cookie中有没有rememberme的值,如果有的话,用==分割, 取得用户名密码进行登入。如果没有这个用户的话,记录下request的action地址然后转到登入页面。如果验证有这个用户,则继续下面的interceptor。 如果cookie中没有信息的话,则记录request的action地址然后转到登入页面。& 以上就是LoginInterceptor的全部代码。
下面我们看看struts.xml
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"&
&package name="default" extends="struts-default"&
&interceptors&
&interceptor name="loginInterceptor" class="loginInterceptor"&&/interceptor&
&interceptor-stack name="loginDefaultStack"&
&interceptor-ref name="loginInterceptor"&&/interceptor-ref&
&interceptor-ref name="defaultStack"&&/interceptor-ref&
&/interceptor-stack&
&/interceptors&
&default-interceptor-ref name="loginDefaultStack"&&/default-interceptor-ref&
&global-results&
&result name="login" type="redirect"&/login.jsp&/result&
&/global-results&
&action name="index" class="indexAction"&
&result&/index.jsp&/result&
&action name="logout" class="logoutAction"&&/action&
&action name="login" class="loginAction" method="login"&
&result type="redirect"&${goingToURL}&/result&
&result name="input"&/login.jsp&/result&
&interceptor-ref name="defaultStack"&&/interceptor-ref&
&action name="register" class="registerAction"&
&result type="redirect"&/login.jsp&/result&
&result name="input"&/register.jsp&/result&
&interceptor-ref name="defaultStack"&&/interceptor-ref&
&/package&
我们是使用的默认的interceptor stack是loginInterceptor, 如果你需要让不登入的用户也能访问的话,你需要配置你的action使用defaultStack。 我们这里的login, register使用的就是defaultStack。 这里要注意的是success的result是我们用LoginInterceptor设过来的值。 这样我们就能够转到用户输入的起始页面。 下面我们再来看看login.jsp 和 loginAction
&%@taglib prefix="s" uri="/struts-tags" %&
&%@ page language="java" contentType="text/ charset=UTF-8"
pageEncoding="UTF-8"%&
&meta http-equiv="Content-Type" content="text/ charset=UTF-8"&
&title&Wallet-Login&/title&
&h2&Login&/h2&
&s:actionmessage/&
&s:actionerror/&
&s:form action="login" method="post" validate="false" theme="xhtml"&
&s:textfield name="loginName" label="Username"&&/s:textfield&&br/&
&s:password name="password" label="Password"&&/s:password&&br/&
&s:checkbox label="Remember Me" name="rememberMe"&&/s:checkbox&
&s:submit value="%{'Login'}"&&/s:submit&
&a href="register.jsp"&Register&/a&
package com.javaeye.dengyin2000.wallet.
import java.util.M
import javax.servlet.http.C
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import mons.lang.StringU
import org.apache.struts2.interceptor.CookiesA
import org.apache.struts2.interceptor.ServletRequestA
import org.apache.struts2.interceptor.ServletResponseA
import org.apache.struts2.interceptor.SessionA
import com.javaeye.dengyin2000.wallet.dao.UserDAO;
import com.javaeye.dengyin2000.wallet.dao.UserNotFoundE
import com.javaeye.dengyin2000.wallet.domains.U
import com.javaeye.dengyin2000.wallet.interceptor.LoginI
import com.opensymphony.xwork2.ActionS
public class LoginAction extends ActionSupport implements ServletResponseAware, ServletRequestAware, SessionAware, CookiesAware{
private UserDAO userD
private String loginN
private boolean rememberMe;
private HttpServletR
private HttpServletR
private String goingToURL;
public String getGoingToURL() {
return goingToURL;
public void setGoingToURL(String goingToURL) {
this.goingToURL = goingToURL;
public boolean isRememberMe() {
return rememberMe;
public void setRememberMe(boolean rememberMe) {
this.rememberMe = rememberMe;
public String getLoginName() {
return loginN
public void setLoginName(String loginName) {
this.loginName = loginN
public String getPassword() {
public void setPassword(String password) {
this.password =
public String login()throws Exception{
User user = userDao.attemptLogin(loginName, password);
if (rememberMe){
Cookie cookie = new Cookie(LoginInterceptor.COOKIE_REMEMBERME_KEY, user.getLoginName() + "==" + user.getPassword());
cookie.setMaxAge(60 * 60 * 24 * 14);
response.addCookie(cookie);
session.put(LoginInterceptor.USER_SESSION_KEY, user);
String goingToURL = (String) session.get(LoginInterceptor.GOING_TO_URL_KEY);
if (StringUtils.isNotBlank(goingToURL)){
setGoingToURL(goingToURL);
session.remove(LoginInterceptor.GOING_TO_URL_KEY);
setGoingToURL("index.action");
return SUCCESS;
} catch (UserNotFoundException e) {
addActionMessage("user name or password is not corrected.");
return INPUT;
public UserDAO getUserDao() {
return userD
public void setUserDao(UserDAO userDao) {
this.userDao = userD
public void setServletResponse(HttpServletResponse response) {
this.response =
public void setServletRequest(HttpServletRequest request) {
this.request =
public void setSession(Map session) {
this.session =
public void setCookiesMap(Map cookies) {
this.cookies =
差不多就是这么多代码了。 最后看看logoutAction
package com.javaeye.dengyin2000.wallet.
import javax.servlet.http.C
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
import org.apache.struts2.interceptor.ServletRequestA
import org.apache.struts2.interceptor.ServletResponseA
import com.javaeye.dengyin2000.wallet.interceptor.LoginI
import com.opensymphony.xwork2.ActionS
public class LogoutAction extends ActionSupport implements ServletRequestAware , ServletResponseAware{
private HttpServletR
private HttpServletR
public String execute() throws Exception{
HttpSession session = request.getSession(false);
if (session!=null)
session.removeAttribute(LoginInterceptor.USER_SESSION_KEY);
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
if (LoginInterceptor.COOKIE_REMEMBERME_KEY.equals(cookie
.getName())) {
cookie.setValue("");
cookie.setMaxAge(0);
response.addCookie(cookie);
return "login";
return "login";
public void setServletRequest(HttpServletRequest request) {
this.request =
public void setServletResponse(HttpServletResponse response) {
this.response =
这里需要注意的是需要把cookie也清理下。
applicationContext-struts.xml
&?xml version="1.0" encoding="UTF-8"?&
&!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd"&
&!-- Example of SAF2 action instantiated by Spring --&
&!-- bean id="helloWorldAction" class="tutorial.HelloWorldAction" singleton="false" /&
&bean id="indexAction" class="com.javaeye.dengyin2000.wallet.actions.IndexAction" singleton="false"&&/bean&
&bean id="loginAction" class="com.javaeye.dengyin2000.wallet.actions.LoginAction" singleton="false"&
&property name="userDao" ref="userDao" /&
&bean id="logoutAction" class="com.javaeye.dengyin2000.wallet.actions.LogoutAction" singleton="false"&&/bean&
&bean id="registerAction" class="com.javaeye.dengyin2000.wallet.actions.RegisterAction" singleton="false"&&/bean&
&!-- the following is struts2 interceptors --&
&bean id="loginInterceptor" class="com.javaeye.dengyin2000.wallet.interceptor.LoginInterceptor"&
&property name="userDao" ref="userDao" /&
&bean id="userDao" class="com.javaeye.dengyin2000.wallet.dao.UserDAOImpl"&
参考:http://www.vitarara.org/cms/struts_2_cookbook/creating_a_login_interceptor
浏览 13417
论坛回复 /
(13 / 31596)
dengyin2000
浏览: 861299 次
来自: 广州
我也遇到了这个,用你这个方法,导致下拉刷新不起作用了,你遇到过 ...
LeaderElection(String zookeeper ...
博主, 安装了一部分还是报这个错误!FAILURE: Buil ...
如何在java Web项目中开发WebService接口,地址 ...
不明白原因javaee编程在struts2里面怎么实现拦截器检查用户未登录后在页面弹出一个登录框,登录成功后转到继续完成订单步骤的操作,这个功能怎么完成啊?求高手指点?
回答1:问错版了吧
回答2:把用户信息存入session里面,在拦截器里面判断session中是否有相关的用户信息,有就继续往下走,没有就跳转到登陆页面,在跳转登陆页面时可以将对应的订单信息带到登陆页面中去,在用户登陆后在跳转到订单页面
mystery_tree
回答3:用session&&&打开浏览器后访问对象信息就被保存,可以根据session中的值进行判断
mystery_tree
回答4:判断session&是否存在
mystery0913 上传我的文档
 下载
 收藏
毕业于医学院校,在医院工作,有相对丰富的护理经验
 下载此文档
正在努力加载中...
基于SSH2框架Struts2拦截器的登录验证实现
下载积分:1500
内容提示:基于SSH2框架Struts2拦截器的登录验证实现
文档格式:DOCX|
浏览次数:8|
上传日期: 22:57:40|
文档星级:
该用户还上传了这些文档
基于SSH2框架Struts2拦截器的登录验证实现
官方公共微信java Struts2 在拦截器里的跳转问题
字体:[ ] 类型:转载 时间:
前几天,自已写了一个拦截器,当在里面跳转时,报了一个如下异常,但页面能正常跳转
代码如下:java.lang.IllegalStateException at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:405) at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:725) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:467) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) at java.lang.Thread.run(Thread.java:595) 网上一查,是说页面两次调用了response.sendRedirect()方法,在后面加了一个return null 后,问题成功解决。 因此想,应该在页面跳转时如果报同类型的异常,应该可以用同种方法解决。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 struts2 页面跳转 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信