一、前言
我们做一个信息管理系统,为了保证信息的安全,不被其他人员看到内部的信息,我们一般都会设计一个用户的登录界面,但是仅仅通过登录界面,输入符合要求的用户名和密码,网页帮你跳转到内部页面是没有意义的,因为其他人员一旦知道你内部的链接,他们就可以直接地通过内部的链接,直接进入你的信息管理系统。在JavaWeb中,我们一般设计一个Filter 拦截器,让内部连接都要经历 Filter 来检验是否登录过(登录成功时session.setAttribute,检验时session.getAttribute),也不是很难。
【注意:这里只是使其他人无法进入操作界面而已,而如果别人知道你界面的操作的请求 url 链接,不用进入界面,依旧可以对数据库进行修改,好比一个人失去了 windows 操作,但可以使用 linux 来操作,可以使用 shiro 等安全框架解决】
但以后整合 SSH 框架的时候,就应使用struts2来实现了,也会比较JavaWeb更容易理解,更加简单了,下面笔者用心使用 struts2 来演示一个简单的拦截是否登录过才能进入内部页面的例子。
绝对是最简单最详细最实用的教程,也可以去看我资源里边下载源代码!
可以说是之前一篇登录界面设计的加强版,
议新手先看看基础版,有了结构再来看看加强版的,才容易理解,以便以后应用于项目开发
http://blog.csdn.net/larger5/article/details/78380732
二、先功能演示(下面有附有详细的代码和解析)
①主界面index.jsp,其中的add链接,为模拟进入内部页面的链接,
②现在点击add链接(真正的项目是有很多链接要被检验的,这里为了演示就一个罢了),进入unlogin.jsp页面,说明进不了了,为了更清除拦截的原理,我把拦截的相关信息打印到console上。
控制台输出
记得去查看下面
System.out.println(“未能通过拦截”);
的位置,以及它的”上下文”,明白流程!
③返回登录页面,
先输入错误的帐号,点击登录,就会进入如下页面fail.jsp,提示登录失败
现在输入正确的 账户和密码(一般通过数据库来获取,这里为了演示直接限定了为名larger5,密码123,),点击登录
就会进入如下success.jsp页面
查看console的输出信息(注意第一条是刚刚直接点击链接输出的,第二条是登录成功后输出的)
④现在返回登录界面,
直接点击内部的链接 add
进入如下logined.jsp提示页面
查看console输出,又增加了两新的的提示信息,表示通过拦截才能进去的,而不是平白无故进去的。
每条信息位于那个部位的代码,下面可以查看代码
System.out.println(“通过拦截”);
System.out.println(“成功查看”);
的位置,也是很重要的,你才能清楚,整个流程是怎么回事。
三、代码和解释
(1)前端代码
① index.jsp 登录界面代码
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<center>
<s:form action="login.action">
<s:textfield name="bb.username" label="用户名"></s:textfield>
<s:password name="bb.password" label="密码"></s:password>
<s:submit value="登录" />
</s:form>
<a href="show.action">add</a>
</center>
</body>
</html>
②登录成功界面代码 success.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h4>用户登录成功!</h4>
<h1>用户登录信息</h1>
用户名:<s:property value="#session.username" />
<br>
密码:<s:property value="#session.password"/>
<br>
</body>
</html>
②登录失败界面代码 fail.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h4>用户登录失败!</h4>
</body>
</html>
③登录过界面提示代码 logined.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h4>你已经登录过,可以直接查看内容</h4>
<h2>查看信息</h2>
</body>
</html>
④没有登陆过界面提示代码 unlogin.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h4>还没有登录,请登录</h4>
</body>
</html>
(2)后台代码
①Action.java
package test;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import test.Bean;
//这是一个Action类
public class Action extends ActionSupport {
//OGNL
public Bean getBb() {
return bb;
}
public void setBb(Bean bb) {
this.bb = bb;
}
private Bean bb;
public String login() throws Exception {
if (bb.getUsername().equals("larger5") && bb.getPassword().equals("123")) {
// 下面3条语句就是为了获得session
ServletRequest request = ServletActionContext.getRequest();
HttpServletRequest re = (HttpServletRequest) request;
HttpSession session = re.getSession();
// 下面登录成功,留下Attribute"痕迹",以后通过这些Attribute"痕迹"来检查是否登录过
session.setAttribute("username", bb.getUsername());
session.setAttribute("password", bb.getPassword());
System.out.println("登录成功,以后可以直接通过内部页面的链接进入内部页面了");
return "success";
} else {
return "fail";
}
}
}
②JavaBean.Java
package test;
//一个完整的JavaBean类,用来收集登录账户用户名和密码的信息
public class Bean {
public Bean(String username, String password) {
super();
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "Bean [username=" + username + ", password=" + password + "]";
}
public Bean() {
super();
// TODO Auto-generated constructor stub
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String username;
private String password;
}
③Inter.java 拦截器
package test;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class Inter extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
// 下面3条语句就是为了获得 session
ServletRequest request = ServletActionContext.getRequest();
HttpServletRequest re = (HttpServletRequest) request;
HttpSession session = re.getSession();
// 下面检验是否登录过的痕迹
if (session.getAttribute("username") != null && session.getAttribute("password") != null) {
System.out.println("通过拦截");
return arg0.invoke();
} else {
System.out.println("未能通过拦截");
return "fail";
}
}
}
④Method.java 要拦截的方法
package test;
import com.opensymphony.xwork2.ActionSupport;
public class Method extends ActionSupport {
public String show() throws Exception {
// 模拟是否可以成功进入页面
System.out.println("成功查看");
return "success";
}
}
⑤struts2.xml 配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="larger5" extends="struts-default">
<interceptors>
<interceptor name="checklogin" class="test.Inter"></interceptor>
<interceptor-stack name="myInter">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="checklogin"></interceptor-ref>
</interceptor-stack>
</interceptors>
<action name="login" class="test.Action" method="login">
<result name="success">success.jsp</result>
<result name="fail">fail.jsp</result>
</action>
<action name="show" class="test.Method" method="show">
<result name="fail">unlogin.jsp</result>
<result>logined.jsp</result>
<interceptor-ref name="myInter"></interceptor-ref>
</action>
</package>
</struts>
⑥web.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<!-- 配置 Struts2 的 Filter -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
四、使用 XMind 浏览全局!