在我们制作一个网站项目,或是一个系统的时候,假如我们没有对这个系统做一些过滤的时候,我们只要记住这个网站里面的一些服务的网址,直接在浏览器里面输入这个网址就能访问这个访问了,那么登录功能还有什么用呢???还有的是有些服务可能要vip才能用的,没有一些浏览的过滤。没有登录就访问网站其他页面,网站的服务,网站系统就会很乱,很不安全。大家都能进,不合逻辑。
在jsp解决这个问题,用session。 一般用户登陆信息都存在session中。
我有2种解决方式
(1)如果需要登陆验证才能访问的页面少的话可以通过include文件方式。
把下面代码保存文件名字为checksession.jsp
<%@ page language="java" contentType="text/html;charset=GBK"
pageEncoding="GBK"%>
<%
if(session.getAttribute("userinfo")==null){//用户没有登陆
response.sendRedirect("/login.jsp");//把需要登陆才能访问的页面中包含这个文件。
}
%>
(2)如果需要登陆验证的页面多的话建议采用filter.
先在src目录下创建一个包名为com.filter,然后在这个包里面创建一个名为TestFilter的java文件或是一个servlet文件,代码如下
TestFilter.java
package com.filter;
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;
public class TestFilter implements Filter {
public void destroy() {
//过滤器销毁,一般是释放资源
}
/**
* 某些url需要登陆才能访问(session验证过滤器)
*/
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest)arg0;
HttpServletResponse response=(HttpServletResponse)arg1;
HttpSession session=request.getSession();
//userinfo,需要通过login.jsp 登陆后向session中写入用户信息,标示用户已经登陆
if(session.getAttribute("user")==null){
String errors = "对不起,你还没有登录,请先登陆,再访问此服务!";
request.setAttribute("errors", errors);
request.getRequestDispatcher("/errors/error.jsp").forward(request, response);//跳转到处理页面
}else{
arg2.doFilter(request, response);
}
}
public void init(FilterConfig arg0) throws ServletException {
//初始化操作,读取web.xml中过滤器配置的初始化参数,满足你提的要求不用此方法
}
}
然后在webroot,先创建一个errors的文件夹,用于存储错误处理页面。然后里面创建一个error.jsp的文件用作这个未登陆就访问页面的错误处理页面
error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="gb2312" isErrorPage="true"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'error.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
String error = (String)request.getAttribute("errors");
if(error!=null){
out.print("<h2>"+error+"</h2>");
out.print("<p>");
out.print("<a href='dl.jsp' target='_parent'>前往登录</a> ");
out.print("<a href='HRC/zhuce.jsp' target='_parent'>前往注册</a>");
}
%>
</body>
</html>
然后在webRoot目录下找到,web.xml文件,然后进行全局配置
Web.xml
/*
*TestFilter 在web.xml中配置说明
*
*<filter>
* <filter-name>TestFilter</filter-name>
* <filter-class>com.filter.TestFilter</filter-class>
*</filter>
*配置需要经过login.jsp登陆过才能访问的区域
*目前配置方式仅仅是在用户访问product.jsp的时候才走过滤器,可以配置/*,/user/*等
*。单个文件的配置
*<filter-mapping>
* <filter-name>TestFilter</filter-name>
* <url-pattern>/product.jsp</url-pattern>
*</filter-mapping>
*文件夹的配置
* <filter-mapping>
* <filter-name>TestFilter</filter-name>
* <url-pattern>/user/*</url-pattern>
*</filter-mapping>
* <filter-mapping>
*所有jsp文件
* <filter-name>TestFilter</filter-name>
* <url-pattern>/ *.jsp</url-pattern>
*</filter-mapping>
下面提供效果图