web.xml安全性认证优先过滤器执行导致的一个问题

采用非安全认证对失去session后的处理方式是,在过滤器中设置

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import cn.com.newglobe.ibatis.model.Userinfo;


public class AuthFilter implements Filter {
private static Log log = LogFactory.getLog(AuthFilter.class);

public void init(FilterConfig filterConfig) throws ServletException {
if (log.isDebugEnabled()) {
log.debug("初始化权限过滤器。");
}
}

public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("初始化登录");
/**
* 1,doFilter方法的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括
* 表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过
* 滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。
*/
HttpServletRequest request = (HttpServletRequest) servletRequest;
/**
* 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中
* 无法得到的方法,就要把此request对象构造成HttpServletRequest
*/
HttpServletResponse response = (HttpServletResponse) servletResponse;
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Cache-Control", "no-store");
response.setDateHeader("Expires",0);
String currentURL = request.getRequestURI(); // 取得根目录所对应的绝对路径:
HttpSession session = request.getSession();

// 如果jsp就验证(login.jsp除外)

if ((!currentURL.contains("/logon.jsp"))
&& (!currentURL.contains("/logon/"))
&& (!currentURL.contains("/forword.action"))
&& (!currentURL.contains("/images/"))
&& (!currentURL.contains("/CSS/"))
&& (!currentURL.contains("/service/ledService"))
&& (!currentURL.contains("/codeMaker"))) {
if (log.isDebugEnabled()) {
log.debug("对jsp文件进行权限验证。" + "请求的URL:" + currentURL);
}
//验证Session是否过期
// if(request.isRequestedSessionIdValid()){
// //session过期,转向session过期提示页,最终跳转至登录页面
// response.sendRedirect(request.getContextPath() + "/logon/logOut.action");
// return ;
// }
// 判断当前页是否是重定向以后的登录页面页面,如果是就不做session的判断,防止出现死循环
Userinfo user=(Userinfo) session.getAttribute("user");
if (user == null) {
response.sendRedirect(request.getContextPath() + "/logon/logOut.action");
return;
}
// else {
// Userinfo user=(Userinfo) session.getAttribute("user");
// request.getSession().setAttribute("user",user);
//
// }

}
// 加入filter链继续向下执行
filterChain.doFilter(request, response);
/**
* 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作 为它
* 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另
* 一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。
*/
}

public void destroy() {
}

}

然而采用了安全认证,导致第一步会进行安全认证,web.xml会让失去session或者本身就没有session的用户的界面跳转到登陆界面login.jsp,可是地址栏上的URL却岿然不动,如果不做处理的话将会直接执行你输入的那个url的action,本想着在提交表单的时候操作那个url,不过安全认证让你无从下手,因为
<form name="loginform" method="post" action="j_security_check">

<INPUT name="j_username" type="text">

<INPUT name="j_password" TYPE="password">

<input type="submit" value="登 录" >

</form>


这个安全认证的提交表单的方式让我止步,也许您还可以试试是否可以去看看
 javax.security.auth.Subject;
javax.security.auth.callback.Callback;
javax.security.auth.callback.CallbackHandler;
javax.security.auth.callback.NameCallback;
javax.security.auth.callback.PasswordCallback;
javax.security.auth.login.FailedLoginException;
javax.security.auth.login.LoginException;
javax.security.auth.spi.LoginModule;

这个几个类的源代码,不过那却是非常痛苦的事了,苦思冥想,经一哥们指点,这个问题变得如此的简单,没有session后,页面跳转到了login.jsp,但是url却还在你输入的url中,故此
var firstHref=window.location.href;
if(firstHref.indexOf('HbEip/login/login.jsp')==-1)
{
window.location.href="<%=request.getContextPath()%>/login/login.jsp"
}

只需判断url是不是你登陆的login.jsp,不然的话就跳转了,得到这一解答后,汗了一大把,想到了要从过滤器修改,想过查看安全认证源码,肿么就没想到在jsp上直接跳转呢。学习了一把。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值