SpringMVC生成的驗證碼圖片不顯示問題及解決方法
近期用SSM框架寫一個項目,登錄模塊需要生成驗證碼圖片,我把相關(guān)的代碼寫好了之后傳到 jsp ,但是圖片不顯示,查看控制臺顯示404,反復(fù)查詢了一下代碼并沒有發(fā)現(xiàn)任何問題,代碼如下:
@Controller
public class ValidateCodeController {
private static final long serialVersionUID = 1L;
private static int WIDTH = 70; // 驗證碼圖片的寬度
private static int HEIGHT = 35; // 驗證碼圖片的高度
@RequestMapping("/validateCode")
public void validateCode(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
response.setContentType("image/jpeg");
ServletOutputStream sos = response.getOutputStream();
// 設(shè)置瀏覽器不要緩存該圖片
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
// 創(chuàng)建圖片緩存區(qū)
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics(); // 獲取畫筆
char [] rands = generateCheckCode(); // 產(chǎn)生隨機的驗證碼
// 產(chǎn)生圖像
drawBackground(g);
drawRands(g, rands);
// 結(jié)束繪畫過程,完成圖像
g.dispose();
// 將圖像輸出到客戶端
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "JPEG", bos);
byte [] buf = bos.toByteArray();
response.setContentLength(buf.length);
sos.write(buf);
bos.close();
sos.close();
// 將當(dāng)前驗證碼存入 Session 中
session.setAttribute("valicode", new String(rands));
//System.out.println("1:"+request.getSession().getId());
System.out.println(session.getAttribute("valicode"));
}
private void drawRands(Graphics g, char[] rands) {
g.setColor(new Color(41, 41, 41));
g.setFont(new Font(null, Font.ITALIC|Font.BOLD, 18));
g.drawString("" + rands[0], 2, 17);
g.drawString(" " + rands[1], 16, 20);
g.drawString(" " + rands[2], 31, 13);
g.drawString(" " + rands[3], 46, 18);
//System.out.println(rands);
}
private void drawBackground(Graphics g) {
g.setColor(new Color(255, 255, 255));
g.fillRect(0, 0, WIDTH, HEIGHT);
// 隨機產(chǎn)生 120 個干擾點
for(int i = 0; i < 120; i++) {
int x = (int) (Math.random() * WIDTH);
int y = (int) (Math.random() * HEIGHT);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
g.setColor(new Color(red, green, blue));
g.drawOval(x, y, 1, 0);
}
}
// 生成四個字符的驗證碼
private char[] generateCheckCode() {
String chars = "0123456789abcdefghijklmnopqrstuvwxyz";
char [] rands = new char[4];
for(int i = 0; i <4; i++) {
int rand = (int) (Math.random() * 36);
rands[i] = chars.charAt(rand);
}
return rands;
}
}
jsp 獲取驗證碼圖片的關(guān)鍵代碼如下:
<img src="validateCode" />
后來就給validateCode方法加了一個注解 @ResponseBody 圖片就顯示出來了。然后看了 這篇博客,才得知:
1、responseBody一般是作用在方法上的,加上該注解表示該方法的返回結(jié)果直接寫到Http response Body中,常用在ajax異步請求中,
2、在RequestMapping中 return返回值默認(rèn)解析為跳轉(zhuǎn)路徑,如果你此時想讓Controller返回一個字符串或者對象到前臺 就會報404 not response的錯誤。
3、當(dāng)加上@ResponseBody注解后不會解析成跳轉(zhuǎn)地址 會解析成相應(yīng)的json格式的對象 集合 字符串或者xml等直接返回給前臺 可以通過 ajax 的“success”:fucntion(data){} data直接獲取到。
總結(jié)
到此這篇關(guān)于SpringMVC生成的驗證碼圖片不顯示的文章就介紹到這了,更多相關(guān)spring mvc 驗證碼圖片不顯示內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot結(jié)合maven配置不同環(huán)境的profile方式
這篇文章主要介紹了springboot結(jié)合maven配置不同環(huán)境的profile方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
SpringBoot實現(xiàn)多數(shù)據(jù)源的實戰(zhàn)案例
這篇文章主要介紹了SpringBoot實現(xiàn)多數(shù)據(jù)源的實戰(zhàn)案例,文中通過示例代碼和圖文展示介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2024-01-01
如何通過Maven倉庫安裝Spire系列的Java產(chǎn)品
這篇文章主要介紹了如何通過Maven倉庫安裝Spire系列的Java產(chǎn)品,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-07-07

