java session 重定向_JavaWeb学习之转发和重定向、会话技术:cookie、session、验证码实例、URLConnection使用(下载网页)(4)...

本文介绍了JavaWeb中转发和重定向的区别与应用场景,讲解了如何使用cookie和session进行会话管理,包括设置、获取和删除操作。此外,还提供了验证码的生成与验证实例,以及使用URLConnection下载网页的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、转发和重定向

HttpServletResponse response

转发:

RequestDispatcher dispatcher= request.getRequestDispatcher("/secondServlet"); request.setAttribute("pwd","123");//这里设置的值在secondServlet中可以获取到

dispatcher.forward(request, response);//调用forward方法时会调用secondServlet中的doGet方法

//等到forward方法执行完毕后才会执行下面的代码

System.out.println("secondServlet执行完了");重定向:

String url= "http://www.baidu.com"; response.sendRedirect(url);* 对比

* 何时使用

* 重定向:可以指定当前web项目的URL,也可以指定其他web资源

* 转发:只能指定当前的web项目URL

* 确定使用

* 重定向:在第一次请求中设置值,在重定向后不能获取。两次请求,tomcat创建了两个request

* 完成跳转功能,选重定向

* 转发:设置的值可以在其他servlet或资源中使用。

* 多个servlet需要传递数据时,用转发。

* 总结:

* 请求次数

* 重定向:请求2次,tomcat创建了两个request对象

* 转发:请求1次,tomcat创建了2个request对象

* 将第一个request中的内容,拷贝给第二个request。值相同

* 浏览器地址栏是否修改

* 重定向:修改,看到跳转后页面的内容

* 转发:没有修改,看到的转发后最后一个servlet响应的内容

* request设置的值,是否共享

* 重定向:数据不共享

* 转发:数据共享2、会话:当访问web资源之后,通过连接继续请求当前站点的资源,然后关闭浏览器的整个过程。

* 会话技术:cookie、session

* cookie:

* request.getCookies();获得当前web项目的所有的cookie信息

Cookie[] cookies = request.getCookies(); if(cookies!=null){

for(Cookie c : cookies){

System.out.println(c.getName()+":"+c.getValue());}

}

Cookie cookie= new Cookie("aa","aavalue"); cookie.setMaxAge(60*60*24);//单位是秒

cookie.setPath("/demo/"); response.addCookie(cookie);* 通过setPath可以设置cookie的访问路径

* 在cookie中存放中文

* 编码:String returnData= URLEncoder.encode(data, "UTF-8"); * 解码:String value = URLDecoder.decode(c.getValue(), "UTF-8");* cookie的value可以设置多少个字符:4kb

* session:服务器在服务器端创建一个内存区域,用来存放当前用户的所有信息,通过cookie关联。

* 前提:必须使用cookie

* session:

* tomcat创建

* 销毁:30分钟

//获得session对象

HttpSession session= request.getSession();//保存值

session.setAttribute("number", "abcd");//获得保存的值number

String number= (String)session.getAttribute("number");//移除值number

session.removeAttribute("number");* URL重写

* 一般情况选择encodeURL

* 两个方法区别在于,如果参数为空字符串,返回结果不同。

public String encodeURL(String url) {

String absolute= toAbsolute(url);if (isEncodeable(absolute)) {

// W3c spec clearly said

if (url.equalsIgnoreCase("")){ //****

url= absolute;}

return (toEncoded(url, request.getSessionInternal().getIdInternal()));} else {

return (url);}

}

public String encodeRedirectURL(String url) {

if (isEncodeable(toAbsolute(url))) {

return (toEncoded(url, request.getSessionInternal().getIdInternal()));} else {

return (url);}

}

* 注意:参数url必须有效,否则返回没有改变的URL

* 当使用"/"开头,相对于web站点

* response.encodeURL("/day07/urlSessionServlet2")//如果需要sessionid,则在地址中追加

* /day07/urlSessionServlet2;jsessionid=F85DB5EFDDB9A6B170AF2B4959EFC4FC

* 获得Web的绝对路径

String absolute= toAbsolute(url); * http://localhost:8080/day07/

* 总结:

* 需要考虑用户的Cookie是否禁用了

* 将所有的链接全部进行URL重写(过滤器)3.验证码实例

GetImageServlet.java

package com.yxl.servlet;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class GetImageServlet extends HttpServlet {

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException {

this.doPost(request, response);}

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException {

// 获得一张图片

// 创建图片 -- 在内存中

int width= 80; int height = 40; BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);// 创建图层,获得画板

Graphics g= image.getGraphics();// 确定画笔颜色

g.setColor(Color.BLACK);// 填充一个矩形

g.fillRect(0, 0, width, height);// 只需要一个边框

// 设置颜色

g.setColor(Color.WHITE);// 填充一个矩形

g.fillRect(1, 1, width - 2, height - 2);// 填充字符

String data= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";// 设置字体

g.setFont(new Font("宋体", Font.BOLD, 30));// 缓存随机生成的字符

StringBuffer buf= new StringBuffer();// 随机获得4个字符

Random random= new Random(); for (int i = 0;i < 4; i++) {

// 设置随机颜色

g.setColor(new Color(random.nextInt(255), random.nextInt(255),random.nextInt(255)));// 获得一个随机字符

int index= random.nextInt(62);// 截取字符串

String str= data.substring(index, index + 1);// [)

// 需要将随机的字符,写到图片中

g.drawString(str, 20 * i, 30);// 缓存

buf.append(str);}

// 将获得随机字符串,保存到session

// * 获得session

HttpSession session= request.getSession();// * 保存值

session.setAttribute("number", buf.toString());// 干扰线

for (int i= 0;i < 10; i++) {

// 设置随机颜色

g.setColor(new Color(random.nextInt(255), random.nextInt(255),random.nextInt(255)));// 随机画直线

g.drawLine(random.nextInt(width), random.nextInt(height),random.nextInt(width), random.nextInt(height));}

/**

* jpgimage/jpeg

*/

// 通知浏览器发送的数据时一张图片

response.setContentType("image/jpeg");// 将图片发送给浏览器

ImageIO.write(image, "jpg", response.getOutputStream());}

}

LoginServlet.java

package com.yxl.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet {

public void doGet(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException {

this.doPost(request, response);}

public void doPost(HttpServletRequest request,HttpServletResponse response)

throws ServletException,IOException {

request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8");// 获得用户提交的数据 imageNumber

String imageNumber= request.getParameter("imageNumber");// 需要判断 从session获得保存的验证码的信息

// * 获得session

HttpSession session= request.getSession();// * 获得保存的值number

String number= (String) session.getAttribute("number");PrintWriter out= response.getWriter();// 匹配 用户提交的数据与程序保存的数据

if (number !=null) { // 程序保存

if (number.equalsIgnoreCase(imageNumber)) {

// 输入正确

out.print("验证通过");} else {

// 验证码错误

out.print("验证码错误");}

// 无论情况,程序存储的数据,只能使用一次

session.removeAttribute("number");} else {

out.print("验证码失效");}

}

}

在WebRoot新建login.html页面

1.html

getImageServlet

4.URLConnection使用(下载网页)

package com.yxl.demo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.URL;import java.net.URLConnection;import java.util.Scanner;public class UrlConnectionDemo {

public static void main(String[]args) throws IOException {

// URL类对web资源的定位

URL url= new URL("http://localhost:8080/20141123/login.html");// 获得连接 ,做准备

URLConnection conn= url.openConnection();// 必须确定当前请求,是否可以读写

conn.setDoInput(true);// 确定是否可以读,默认是true

conn.setDoOutput(true);// 确定是否可以写,默认是false

// 准备发送的数据 -- request填充

OutputStream out= conn.getOutputStream(); // out.write("user=abcd1234".getBytes());//此方法将内容写到http请求体中

// 连接

// conn.connect();// 建立链接之后,获得web资源

InputStream is= conn.getInputStream();// 会自动链接,只有调用方法,整个请求才生效

// byte[] buf = new byte[1024]; // int len = -1; // while( (len = is.read(buf)) > -1){

// String str= new String(buf,0,len); // System.out.println(str);// }

Scanner scanner= new Scanner(is);while (scanner.hasNext()) {

System.out.println("url -->" + scanner.nextLine());}

is.close();}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值