继承httpservlet报错2的session报错怎么办?

Servlet——Session(2)之简单应用
1.防止用户非法登录到某个页面
比如我们的用户管理,必须要登录成功后才能跳转到主页面,而不能直接绕过登录页面直接到主页面,这个应用是一个非常常见的应用。
这时候,我们需要使用到Session技术,如下,当在验证用户的控制器LoginClServlet.java验证用户成功后,将当前的用户信息保存在Session对象中:
// 把user对象保存在session
HttpSession session = request.getSession();
session.setAttribute(&login-user&, user);
然后在主页面MainFrame.java最开始的地方,取出Session中的登录用户信息,如果信息为空,则为非法访问,直接跳转到登录页面,并提示相关信息:
// 取出login-user这个session
User login_user = (User)request.getSession().getAttribute(&login-user&);
if(login_user == null){
// 说明用户没有登录,让他跳转到登录页面
request.setAttribute(&error&, &请登录!&);
request.getRequestDispatcher(&/LoginServlet&).forward(request,response);
// 这个return很重要!
那么这里就存在一个问题,一个网站会有很多个需要防止非法访问的页面,如果都是用这种方法岂不是很麻烦?
这里有两种解决办法:
第一种是将这段验证用户的代码封装成函数,每次调用
第二种是使用过滤器(后面会介绍)
2.用户登录时验证输入的验证码是否正确
原理:使用到java的绘图技术
假设我们编写登录页面Login,验证用户的LoginClServlet,以及生成验证码的CreateCode,如下所示:
用户在访问登录页面Login的时候,Login页面会去请求CreateCode这个Servlet生成验证码,然后显示在自己的页面上,然后再提交到LoginClServlet进行验证。很显然,访问Login和请求CreateCode这是从浏览器发出的两次不同的请求,所以,CreateCode产生的验证码字符串必须放入Session中,才能让LoginClServlet拿到,然后进行验证。
那么怎么让登录页面Login显示验证码呢?其实很简单,直接将img的src指向CreateCode这个Servlet即可,如下所示:
out.println(&验证码:&);
可以看到运行结果:
这个登录表单提交到LoginClServlet进行验证,它需要从参数中获取用户输入的验证码,再从Session中取出CreateCode这个Servlet放入Session中的正确的验证码,然后对比两者,它的doGet方法的关键代码如下:
//获取用户的id/password/输入的验证码
String id = request.getParameter(&id&);
String passwd = request.getParameter(&passwd&);
// 用户输入的验证码
String input_checkcode = request.getParameter(&checkcode&);
// 正确的验证码
String checkcode = (String)request.getSession().getAttribute(&checkcode&);
// 先看验证码对不对
if(input_checkcode.toLowerCase().equals(checkcode)){
// 验证码OK,再到验证id和passwd
request.setAttribute(&error&, &验证码有误&);
request.getRequestDispatcher(&/Login&).forward(request, response);
这里最重要的其实是生成验证码的Servlet,Servlet代码如下:
import java.awt.C
import java.awt.F
import java.awt.G
import java.awt.image.BufferedI
import java.io.IOE
import java.util.R
import javax.imageio.ImageIO;
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
public class CreateCode extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 7.禁止缓存随机图片
response.setDateHeader(&Expires&, -1);
response.setHeader(&Cache-Control&, &no-cache&);
response.setHeader(&Pragma&, &no-cache&);
// 6.通知客户机以图片方式打开发送过去的数据
response.setHeader(&Content-Type&, &image/jpeg&);
// 1.在内存中创建一幅图片
BufferedImage image = new BufferedImage(110, 30,
BufferedImage.TYPE_INT_BGR);
// 2.向图片上写数据
Graphics g = image.getGraphics();
// 设背景色
g.setColor(Color.white);
g.fillRect(0, 0, 110, 30);
String checkcode = &&;
// 画5个验证码字符
for(int i=0;i&5;i++){
g.setColor(generateColor());
g.setFont(generateFont());
String str = generateStr();
checkcode +=
g.drawString(str,20*i,25);
// 画干扰点
for(int i=0;i&100;i++){
Random random = new Random();
int x = random.nextInt(110);
int y = random.nextInt(30);
g.setColor(generateColor());
g.fillOval(x, y, 2, 2);
// 画干扰线
for(int i=0;i&5;i++){
Random random = new Random();
int x1 = random.nextInt(110);
int y1 = random.nextInt(30);
int x2 = random.nextInt(110);
int y2 = random.nextInt(30);
g.setColor(generateColor());
g.drawLine(x1, y1, x2, y2);
// 这句话就是把随机生成的验证码,保存到session
// 验证码不区分大小写,所以这里转为小写
request.getSession().setAttribute(&checkcode&, checkcode.toLowerCase());
// 5.把写好数据的图片输出给浏览器
ImageIO.write(image, &jpg&, response.getOutputStream());
* 生成随机字体
public Font generateFont() {
String[] font_names = new String[] { &Broadway&, &方正姚体&,
&Footlight MT Light&, &Sitka Text&, &方正舒体&, &幼圆& ,&Colonna MT&};
int[] font_styles = new int[]{Font.BOLD, Font.ITALIC, Font.BOLD|Font.ITALIC};
Random random = new Random();
int name_index = random.nextInt(font_names.length);
int style_index = random.nextInt(font_styles.length);
return new Font(font_names[name_index],font_styles[style_index],28);
* 生成随机颜色
public Color generateColor() {
Random random = new Random();
return new Color(random.nextInt(256), random.nextInt(256),
random.nextInt(256));
* 生成随机数[0-9a-zA-Z]
public String generateStr() {
String[] nums = new String[62];
// 添加0-9这10个数字
for (int i = 0; i & 10; i++) {
nums[i] = String.valueOf(i);
// 添加A-Z这26个大写字母
for (int i = 65; i & 91; i++) {
nums[i - 55] = Character.toString((char) i);
// 添加a-z这26个小写字母
for (int i = 97; i & 123; i++) {
nums[i - 61] = Character.toString((char) i);
// 产生一个随机数
Random random = new Random();
int index = random.nextInt(62);
return nums[index];
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
3.实现简易购物车
假设我们要在网上买书,那么怎么实现添加到购物车,并可以查看购物车的功能呢?肯定要使用Session。
首先,我们先写一个Book类,该类封装Book的相关信息,这里简单起见,主要有ID号,书名,以及购买的本数。然后模拟一个数据库,如下:
&code class=&language-java hljs &&import java.util.HashM
import java.util.LinkedHashM
* 模拟数据库
final public class DB {
private static HashMap&font color=&white&&&string, book=&&& hm =
private DB(){
hm = new LinkedHashMap&string, book=&&&();
Book book1 = new Book(&1&, &基础&, 0);
Book book2 = new Book(&2&, &数据库&, 0);
Book book3 = new Book(&3&, &C语言&, 0);
Book book4 = new Book(&4&, &核心教程&, 0);
Book book5 = new Book(&5&, &Web技术&, 0);
hm.put(book1.getId(),book1);
hm.put(book2.getId(),book2);
hm.put(book3.getId(),book3);
hm.put(book4.getId(),book4);
hm.put(book5.getId(),book5);
* 得到数据库中所有的书
public static HashMap&string, book=&&& getBooks(){
* 根据ID得到书
* @param id
public static Book getBookById(String id){
if(hm.containsKey(id)){
return hm.get(id);
}&/string,&&/string,&&/string,&&/font&&/code&
然后在我们的showBook这个Servlet中读取数据库中所有的书的信息,显示在页面上,它的doGet方法为:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(&text/charset=utf-8&);
PrintWriter out = response.getWriter();
out.println(&
&); out.println(&&); HashMap books = DB.getBooks(); Iterator it = books.keySet().iterator(); while(it.hasNext()){ Book book = books.get(it.next()); out.println(&&); } out.println(&
&+book.getName()+&
可以看到,当用户点击购买的链接时,跳到BuyBookCl这个Servlet进行处理,并且一同传递过去的参数为书的id号,我们看看BuyBookCl是怎么写的:
&code class=&language-java hljs &&public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(&text/charset=utf-8&);
//接收用户购买书的名字
String id = request.getParameter(&id&);
String name = DB.getBookById(id).getName();
HttpSession session = request.getSession();
// 用HashMap更简单
// 从session中得到购买的 书
HashMap&font color=&white&&&string,book& books = (HashMap&string,book&) session.getAttribute(&books&);
if(books == null){
books = new LinkedHashMap&string,book&();
if(books.containsKey(id)){
Book book = books.get(id);
book.setNum(book.getNum()+1);
Book book = new Book(id, name, 1);
books.put(id, book);
session.setAttribute(&books&, books);
// 转发到ShowMyCart查看购物车
request.getRequestDispatcher(&/ShowMyCart&).forward(request, response);
}&/string,book&&/string,book&&/string,book&&/font&&/code&
我们接收到书的id后,然后从Session中取出保存购物车信息的HashMap,如果这个HashMap为空,则新建一个HashMap;如果这个HashMap不为空,则去查找是否存在该书的ID号,如果已经存在,说明之前已经购买过该书,则将这本书的数量加1,,反之将新购买的书添加进去,并且数量设置为1。
看一下运行结果:
1.ShowBook的页面:
2.点击购买之后跳转到购物车的页面:
vcj0="white">以上是应用Session的三个简单的例子,在实际项目中,肯定不止这么简单,比如购物车,最终肯定是要存储在数据库中的。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'Java/Servlet(4)
初始化的方法可以使用init() 完成,但是里面却可以传入一个ServletConfig的对象,此对象就是可以接收初始化配置参数的操作
如果不熟悉的读者,可以参考之前讲解的JSP 内置对象中的config& 对象的使用
因为所有的初始化参数都必须在web.xml& 文件之中进行配置
public&void&init(ServletConfig&config)&&&&&&&&&&&&throws&ServletException&&
package&org.gz.&&import&java.io.*;&&import&javax.servlet.*;&&import&javax.servlet.http.*;&&public&class&InitParamServlet&extends&HttpServlet&&{&&&&&&private&String&initParam&=&null;&&&&&&&&public&void&init(ServletConfig&config)&throws&ServletException&{&&&&&&&&&&this.initParam&=&config.getInitParameter(&ref&);&&&&&&&&&&&&&&&}&&&&&&public&void&doGet(HttpServletRequest&req,&HttpServletResponse&resp)&throws&ServletException,IOException&{&&&&&&&&&&System.out.println(&***初始化参数:&&&+&this.initParam);&&&&&&}&&&&&&public&void&doPost(HttpServletRequest&req,&HttpServletResponse&resp)&throws&ServletException,IOException&{&&&&&&&&&&this.doGet(req,resp);&&&&&&}&&}&&&
&&&&&&&&&&initParam&&&&&&&&&&org.gz.servlet.InitParamServlet&&&&&&&&&&&style=&color:#3333FF;&&&&&&&&&&&&&&&ref&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&initParam&&&&&&&&&&/InitParamServlet&&&&&&&&
&&& 但是在进行操作的时候有一个注意点必须引起注意,如果现在在Servlet 之中同时覆写了两个 init()& 方法,则只有取得初始化参数的 init()& 方法起作用
&&& 从一般的角度而言,取得初始化参数的操作在一些系统的架构中比较常用的,例如,之后要讲解的Struts 开发框架,就使用此种操作。
&&& 之前在JSP 中讲解的config& 对象的使用,也是利用了同样的原理完成的,所有的初始化参数必须通过映射路径才可以取得
可以从Servlet 中取得session 对象并进行操作
可以从Servlet 中取得Application 对象并进行操作
取得HttpSession 实例
1、取得session对象
在Servlet 程序中要想取得一个 session 对象,则可以通过 HttpServletRequest 接口完成,在此接口中提供了以下的操作方法
public HttpSession getSession();
public HttpSession getSession(boolean create)&
Servlet 本身提供的只有request 和 response 两个对象,所有如果要想取得session 对象,则只能依靠request 对象,因为session 属于HTTP 协议范畴,而且在每次发送请求的时候,服务器都会自动为客户端设置一个Cookie 所以,很自然的,Session 中要使用得到了Cookie 的机制,但是Cookie 又只能通过request 取得,那么自然session 也就只能通过request 取得了。
package&org.gz.&&import&java.io.*;&&import&javax.servlet.*;&&import&javax.servlet.http.*;&&&&public&class&HttpSessionServlet&extends&HttpServlet&{&&&&&&public&void&doGet(HttpServletRequest&req,&HttpServletResponse&resp)&throws&ServletException,IOException&{&&&&&&&&&&HttpSession&hs&=&req.getSession();&&&&&&&&&&System.out.println(&Session&ID&---&&&&+&hs.getId());&&&&&&&&&&&&&hs.setAttribute(&username&,&大哥大&);&&&&&&&&&&&&System.out.println(&username属性内容:&&&+&hs.getAttribute(&username&));&&&&&&}&&&&&&public&void&doPost(HttpServletRequest&req,&HttpServletResponse&resp)&throws&ServletException,IOException&{&&&&&&&&&&doGet(req,resp);&&&&&&&&&&}&&}&&&&&&&&&&&&&
2、取得application 对象
在讲解如果取得application对象之前,先来回顾应一个问题,在之前讲解内置对象的时候一直强调公,对于application 对象可以通过 this.getServletContext() 方法取得
public&ServletContext&getServletContext()&&
&&& 现在在HttpServlet 的父类之中已经专门提供了取得ServletContext接口 的对象,所有下面就利用此方法完成功能.
package&org.gz.&&import&java.io.*;&&import&javax.servlet.*;&&import&javax.servlet.http.*;&&&&public&class&ServletContextServlet&extends&HttpServlet&{&&&&&&public&void&doGet(HttpServletRequest&req,&HttpServletResponse&resp)&throws&ServletException,IOException&{&&&&&&&&&&ServletContext&app&=&super.getServletContext();&&&&&&&&&&System.out.println(&真实路径:&&&+&app.getRealPath(&/&));&&&&&&&&}&&&&&&public&void&doPost(HttpServletRequest&req,&HttpServletResponse&resp)&throws&ServletException,IOException&{&&&&&&&&&&doGet(req,resp);&&&&&&&&&&}&&}&&
通过getSession() 方法可以直接取得HttpSession 的实例化对象
通过getServletContext()& 方法可以取得ServletContext 的实例化对象
取得了 session 之后就意味着可以进行登录验证了
通过getServletContext() 方法可以取得application 对象,而之前调用的 this.getServletContext() 方法完成的也是这样的功能。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
(1)(1)(1)(6)(7)(4)(3)(4)(18)(15)(1)经检测你所在的网络可能存在爬虫,因资源限制,我们只能拒绝你的请求。
如果你是推酷的用户,可以以继续访问使用。
如有疑问,可将IP信息发送到
请求解封。session的说明:
1.session是服务端技术,存放在服务器
2.一个用户浏览器对应一个session域对象,一对一的对应关系
3.session的默认生命周期是30min,可以通过web.xml修改
4.session中可以存放多个属性
5.session可以存放对象
6.如果同一个浏览器,session.setAttribute("name",val)设置属性的时候,如果名字相同,会替换该对象的值
创建session
//访问session,当发现没有session时候,就会自动创建session
httpSession session=request.getSession();
//给session放入属性
session.setAttribute("uname","名字");
session.setAttribute("age",60);
//删除属性
session.removeAttribute("age");
//session的生命周期默认30min tomcat的web.xml文件默认设置
浏览器获取session
//获取session
HttpSession session=request.getSession();
String uname = (String)session.getAttribute("uname");
防止用户非法登录到某个页面:
当用户登录成功后,可以把信息存放到session,然后再需要验证的页面中获取用户信息,如果为null,则说明用户非法,可以让其重新登录。
修改session的生命周期:
这样修改:
// 1. 一个地方是tomcat/conf/web.xml
  &session-config&
    &session-timeout&30&/session-timeout&
&/session-config&
//对所有的web应用生效
// 2. 另一个地方,就是单个的web应用下去修改web.xml文件同样写上面的代码
&session-config&
    &session-timeout&30&/session-timeout&
&/session-config&
//如果冲突就以自己的web应用为标准
3....session.setMaxInactiveInterval(60);//60秒指的是发呆时间,60秒内无操作就死亡
session的生命周期示意图
在session中禁用cookie
在项目的webRoot目录中的META-INF文件下,打开或者创建context.xml文件下,编辑内容:(只在某个项目中禁用cookie)
&?xml version="1.0" encoding="UTF-8"?&
&Context cookies="false" path="/ch06"&
&/Context&
 或者打开tomcat的配置文件context.xml(禁用tomcat中所以web项目中的cookie)
&?xml version="1.0" encoding="UTF-8"?&
&Context cookies="false"&........
&/Context&
7.为什么浏览器能够为不同的浏览器提供不同的session
阅读(...) 评论()}

我要回帖

更多关于 新建servlet报错 的文章

更多推荐

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

点击添加站长微信