`
yjingzeming
  • 浏览: 45329 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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上直接跳转呢。学习了一把。
分享到:
评论

相关推荐

    在web.xml中引入其他xml配置文件的步骤

    例如,在示例中提到的`test.xml`包含了过滤器(`filter`)的相关配置: ```xml &lt;filter-name&gt;CasValidationFilter &lt;filter-class&gt;org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter ...

    详解Spring mvc的web.xml配置说明

    例如,`org.springframework.web.filter.CharacterEncodingFilter`是一个预设的过滤器,用于确保请求和响应的字符编码一致。我们可以在`filter-mapping`标签中指定哪些URL应该经过此过滤器。 3. **处理请求...

    web.xml配置文件详解

    以下是一个简单的`web.xml`文件示例,展示了如何配置部分上述提到的配置项: ```xml &lt;web-app&gt; &lt;display-name&gt;My Web Application &lt;description&gt;A simple Java web application. &lt;!-- 配置环境参数 --&gt; ...

    web.xml加载顺序与web.xml常用节点解析

    - 遵循`web.xml`的规范和约定,确保配置文件的正确性和可读性,避免因顺序问题导致的部署失败。 了解`web.xml`的加载顺序和节点解析,有助于我们更有效地配置和管理Web应用程序,确保其在运行时能够按照预期工作。...

    web.xml配置详解

    web.xml 配置详解 web.xml 配置详解是指在 ...web.xml 配置详解是 Java Web 应用程序中一个非常重要的配置文件,它包含了很多描述 servlet/JSP 应用的各个方面的元素,对于 Java Web 应用程序的开发和配置非常重要。

    jboss-web.xml jndi.properties oracle-ds.xml

    这个文件主要负责定义应用的Servlet、过滤器、监听器以及与EJB交互的JNDI(Java Naming and Directory Interface)命名规则。例如,你可以在这个文件中配置安全角色、会话超时、EJB引用等信息。通过JNDI,Web层可以...

    Filter过滤器的代码及其web.xml配置代码

    在Java Web开发中,Filter(过滤器)是一个非常重要的组件,它允许我们在数据处理之前或之后执行特定的任务,比如防止跨站脚本攻击(XSS)、处理字符编码问题、实现权限控制等。在这个主题中,我们将深入理解Filter的...

    web.xml+详细解析.rar

    总结,`web.xml`是Java Web开发中的关键配置文件,它定义了应用程序的运行环境和行为,理解和熟练使用`web.xml`对于提升开发效率和维护性至关重要。通过深入学习和实践,开发者可以更好地掌控Web应用的运行逻辑,...

    web.xml过滤器知识

    在Java Web开发中,`web.xml`过滤器是一个不可或缺的部分,它为开发者提供了强大的功能,帮助他们实现对Servlet和JSP页面的预处理和后处理。过滤器在服务器上先于目标Servlet或JSP页面执行,能够拦截、修改请求和...

    java web项目 web.xml配置详解

    在Java Web开发中,`web.xml`文件是应用的核心配置文件,它定义了Servlet、过滤器、监听器等组件,并负责映射它们的行为。本文将深入解析`web.xml`配置,帮助开发者理解其背后的原理和用途。 一、web.xml文件概述 `...

    web.xml的配置

    - **`filter`**:定义一个过滤器,关联到实现`javax.servlet.Filter`接口的类,对请求进行预处理或后处理。 - **`filter-mapping`**:将过滤器与特定的servlet或JSP页面关联,控制过滤器的执行范围。 - **`...

    Web.xml配置详解

    《Web.xml配置详解》 ...通过精细配置`web.xml`,开发者可以实现对Web应用的高级控制,包括过滤、监听、安全性以及资源管理等多个方面。因此,深入学习和熟练运用`web.xml`是每个Web开发者必备的技能之一。

    web.xml详细配置说明

    通过web.xml,开发者可以控制请求处理流程、设置应用级别的配置,以及实现高级功能如过滤、监听和安全性。同时,由于web.xml遵循严格的XML规范和元素顺序,因此保持良好的格式和顺序有助于确保应用在不同服务器上的...

    java/jsp web.xml详解

    在Java和JSP开发中,`web.xml`文件是一个至关重要的组成部分,它是Servlet容器(如Tomcat)的部署描述符。这个文件包含了关于Web应用程序的配置信息,包括Servlet的定义、过滤器、监听器、会话配置、MIME类型映射、...

    web.xml 配置大全

    在Java EE应用开发中,`web.xml`是一个至关重要的配置文件,它被称为部署描述符(Deployment Descriptor)。这个文件主要用于定义应用程序的行为,特别是关于Web应用程序的组件、如Servlet、过滤器和监听器等的配置...

    web.xml配置解析

    `web.xml`是Java Web应用程序中的核心配置文件,用于描述和管理Web应用程序的各种组件,如Servlet、过滤器(Filter)、监听器(Listener)等。它是一个XML文件,遵循特定的DTD(Document Type Definition)规范,...

    web.xml配置详细介绍(CHM)

    通过深入学习`web.xml`的配置,开发者可以精确控制Web应用的行为,优化性能,提升安全性,实现更复杂的业务逻辑。这个CHM文件是理解`web.xml`配置的宝贵资源,可以帮助开发者快速掌握Web应用的配置技巧。

    关于Web.xml配置说明

    Web.xml的配置决定了Web应用的行为和结构,正确配置可以提高应用的可移植性、性能和安全性。每个元素都有其特定作用,理解并熟练掌握它们对于开发和维护高质量的Web应用程序至关重要。在实际开发中,还需要结合具体...

    web.xml元素详解

    `filter-mapping`元素用于关联一个或多个`servlet`或`JSP`页面到特定的过滤器上,确保过滤器能够在请求处理流程中正确执行。 #### 8. Listener 自从Servlet API版本2.3开始,`listener`元素允许注册监听器,这些...

Global site tag (gtag.js) - Google Analytics